IO_day5

第一题:测试错误检查所和地柜所是否会造成死锁状态

静态创建锁时,编译出错加上-D _GNU_SOURCE

//错误检查锁的静态和动态创建,不会造成死锁
#include<myhead.h>
pthread_mutex_t m1;
pthread_mutex_t m2;
//	pthread_mutex_t m1 = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
//	pthread_mutex_t m2 = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
pthread_mutexattr_t arr;
void* run(void* arg)
{
	while(1)
	{
		pthread_mutex_lock(&m1);
		printf("a\n");
		sleep(1);
	}
}
int main(int argc, const char *argv[])
{
	pthread_mutexattr_init(&arr1);
	pthread_mutexattr_settype(&arr1,PTHREAD_MUTEX_ERRORCHECK_NP);

	pthread_mutex_init(&m1,&arr);
	pthread_mutex_init(&m2,&arr);

	pthread_t id;
	pthread_create(&id,0,run,0);
	//pthread_mutex_init(&m1,0);
	//pthread_mutex_init(&m2,0);	
	while(1)
	{
		pthread_mutex_lock(&m2);
		printf("b\n");
		sleep(1);
	}
	return 0;
}
递归锁会造成死锁
#include<myhead.h>
//静态创建2把锁
pthread_mutex_t m1 = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
pthread_mutex_t	m2 = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
//pthread_mutex_t m1;
//pthread_mutex_t m2;
void* run(void* arg)
{
	while(1)
		{
	//	pthread_mutex_lock(&m2);	
	//	pthread_mutex_lock(&m2);	
		pthread_mutex_lock(&m2);	
	//	pthread_mutex_lock(&m2);	
	//	pthread_mutex_lock(&m2);	
		
		sleep(1);
		printf("a\n");
	//	pthread_mutex_unlock(&m1);//解锁三次
		//pthread_mutex_unlock(&m1);	
		pthread_mutex_unlock(&m1);	
	}
}
int main(int argc, const char *argv[])
{	
	pthread_mutex_init(&m1,0);
	pthread_mutex_init(&m2,0);	
	//动态创建
	//设置锁的属性为递归锁
//	pthread_mutexattr_t attr;
//	pthread_mutexattr_init(&attr);
//	pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP);
	//初始化锁
//	pthread_mutex_init(&m1,&attr);
//	pthread_mutex_init(&m2,&attr);
	
	pthread_t id;
	pthread_create(&id,0,run,NULL);
	while(1)
	{
		//pthread_mutex_lock(&m1);//上锁三次
		//pthread_mutex_lock(&m1);	
		//pthread_mutex_lock(&m1);	
		//pthread_mutex_lock(&m1);	
		//pthread_mutex_lock(&m1);	
		pthread_mutex_lock(&m1);	
		printf("A\n");	
		sleep(1);
		pthread_mutex_unlock(&m2);	
	}	
	return 0;
}

第二题:有2条隧道,一条快速隧道,一条普通隧道。有5列火车,3列复兴号,2列绿皮

要求:复兴号2条隧道都能走,绿皮车只能走普通隧道,模拟火车过隧道的场景

#include<myhead.h>

typedef struct Msg
{
	int type;
//	pthread_mutex_t this_mutex;
}Msg,*msg_ptr;

pthread_mutex_t m1;
pthread_mutex_t m2;

//11 12 12 代表高铁
//21 22 代表绿皮车

void* tunnel(void *arg)
{
	msg_ptr ptr = (msg_ptr)arg;
	int type = ptr->type;
	while(1){
	if(type == 11 || type == 12 || type==13)	
	{
		//pthread_mutex_this_m1 = ptr.this_mutex;
		//pthread_mutex_lock(this_m1);
		pthread_mutex_lock(&m1);
		printf("高铁%d正在通过快速隧道\n\n",type);	
		sleep(2);
		printf("高铁%d已经通过快速隧道\n\n",type);	
		pthread_mutex_unlock(&m1);

		
		pthread_mutex_lock(&m2);
		printf("高铁%d正在通过慢速隧道\n\n",type);
		sleep(2);
		printf("高铁%d已经通过慢速隧道\n\n",type);
		pthread_mutex_unlock(&m2);

	}
	else if(type == 21 || type == 22)
	{
		//pthread_mutex_t this_m2 = ptr.this_mutex;
		pthread_mutex_lock(&m2);
		printf("绿皮%d正在通过慢速隧道\n\n",type);
		sleep(4);
		printf("绿皮%d已经通过慢速隧道\n\n",type);
		pthread_mutex_unlock(&m2);
	}
	}
}

int main(int argc, const char *argv[])
{
	pthread_mutex_init(&m1,0);	
	pthread_mutex_init(&m2,0);	
	
	int type;

	
	pthread_t fast1,fast2,fast3,slow1,slow2;

	Msg msg[5] = {{11},{12},{13},{21},{22}};
	pthread_create(&fast1,0,tunnel,&msg[0]);
	pthread_create(&fast2,0,tunnel,&msg[1]);
	pthread_create(&fast3,0,tunnel,&msg[2]);
	pthread_create(&slow1,0,tunnel,&msg[3]);
	pthread_create(&slow2,0,tunnel,&msg[4]);
	
	pthread_detach(fast1);
	pthread_detach(fast2);
	pthread_detach(fast3);
	pthread_detach(slow1);
	pthread_detach(slow2);
	

	while(1);	
	return 0;
}

第三题:编写2个线程

#include<myhead.h>


void* run(void* arg)
{
  printf("子线程代码\n");
}


int main(int argc, const char *argv[])
{ 
  pthread_t id1;
  pthread_t id2;
  
  pthread_create(&id1,0,run,0);
  pthread_create(&id2,0,run,0);
  
  pthread_detach(id1);
  pthread_detach(id2);
  
  while(1);
  return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值