7.19IO

 

int main(int argc,char* agr[])
{
 
    pthread_mutex_t mutex;  //定义互斥锁对象
 
    //定义(创建)互斥锁属性
    pthread_mutexattr_t mutexattr;
 
    //初始化互斥锁属性
    pthread_mutexattr_init(&mutexattr);
 
    if(strcmp(agr[1],"error" == 0))
    {
        //设置互斥锁类型
pthread_mutexattr:_settype(&mutexattr,PTHREAD_MUTEX_ERRORCHECK);//检错互斥锁
 
    }
    else if(strcmp(agr[1],"normal" == 0))
    {
        pthread_mutexattr_settype(&mutexattr,PTHREAD_MUTEX_NORMAL);//标准互斥锁
 
    }
    else if(strcmp(agr[1],"recursive" == 0))
    {
        pthread_mutexattr_settype(&mutexattr,PTHREAD_MUTEX_RECURSIVE);//递归互斥锁
 
    }
 
    pthread_mutex_init(&mutex,&mutexattr);   //初始化, 
    if(pthread_mutex_lock(&mutex)!=0)
    {
    	printf("上锁失败\n") ;  
	}        
    else
	{
    	printf("上锁成功\n") ;  
	}
 
    if(pthread_mutex_lock(&mutex)!=0)
    {
        printf("上锁失败\n");
    }
    else {
        printf("上锁成功\n");
    }
 
    pthread_mutex_unlock(&mutex); //上两次锁,解两次锁
    pthread_mutex_unlock(&mutex);
 
    pthread_mutexattr_destroy(&mutexattr);   //销毁互斥锁属性
    pthread_mutex_destroy(&mutex);   //销毁互斥锁
    return 0;
}

 

pthread_mutex_t lockMN;
pthread_mutex_t lockMQ;
pthread_mutex_t lockN;
pthread_mutex_t lockQ;
 
int chaQ = -1;
int chaQT = 0;
int chaN = -1;
int chaNT = 0;
 
void* TrainPrintf()
{
	while(1)
	{
		//printf("\033[A");
		if(0 > chaQ)
			printf("快速隧道状态:空闲\n");
		else if(1 == chaQ)
			printf("快速隧道状态:复兴号,%d秒后通过\n",chaQT);
		else
			printf("快速隧道状态:错误\n");
		//
		if(0 > chaN)
			printf("普通隧道状态:空闲\n");
		else if(0 == chaN)
			printf("普通隧道状态:绿皮,%d秒后通过\n",chaNT);
		else if(1 == chaN)
			printf("普通隧道状态:复兴号,%d秒后通过\n",chaNT);
		else
			printf("普通隧道状态:错误\n");
		fflush(stdout);
		sleep(1);
		printf("\033[A\033[K");
		printf("\033[A\033[K");
	}
}
void* Rnormal(void* data)
{
	while(1)
	{
		pthread_mutex_lock(&lockN);
		while(chaNT > 0)
		{
		sleep(1);
		chaNT--;
		//if(0 >= chaNT) break;
		}
		chaN = -1;
		pthread_mutex_unlock(&lockMN);
	}
}
void* Rquik(void* data)
{
	while(1)
	{
		pthread_mutex_lock(&lockQ);
		while(chaQT > 0)
		{
			sleep(1);
			chaQT--;
			//if(0 >= chaQT) break;
		}
		chaQ = -1;
		pthread_mutex_unlock(&lockMQ);
	}
 
}
int main(int argc, const char *argv[])
{
	pthread_mutex_init(&lockMN,0);
	pthread_mutex_init(&lockMQ,0);
	pthread_mutex_init(&lockN,0);
	pthread_mutex_init(&lockQ,0);
 
	pthread_mutex_lock(&lockN);
	pthread_mutex_lock(&lockQ);
	
	int traintype[5]={0,1,1,0,1};//1-复兴 0-绿皮
 
	pthread_t pid1 = 0,pid2 = 0,pidout = 0;
	if(0 != pthread_create(&pid1,0,Rnormal,0) ||
	0 != pthread_create(&pid2,0,Rquik,0)||
	0 !=pthread_create(&pidout,0,TrainPrintf,0))
	{
		pthread_detach(pid1);
		pthread_detach(pid2);
		pthread_detach(pidout);
		pthread_mutex_destroy(&lockMN);
		pthread_mutex_destroy(&lockMQ);
		pthread_mutex_destroy(&lockN);
		pthread_mutex_destroy(&lockQ);
		return -1;
	}
 
	pthread_detach(pid1);
	pthread_detach(pid2);
	pthread_detach(pidout);
	//sleep(2);
	for(int i = 0;i < 5;i++)
	{
		int ISInCh = 0;
		//检查快速隧道
		if(1 == traintype[i] && 0 == ISInCh)
		{
			if(0 == pthread_mutex_trylock(&lockMQ))
			{
				if(1 == traintype[i])chaQT = 5;
				else chaQT = 0;
				//printf("1\n");
				chaQ = traintype[i];
				ISInCh = 1;
				pthread_mutex_unlock(&lockQ);
			}
		}
		//检查普通隧道
		if(0 == pthread_mutex_trylock(&lockMN) && 0 == ISInCh)
		{
			if(0 == traintype[i]) chaNT = 20;
			else if(1 == traintype[i]) chaNT = 10;
			else chaNT = 0;
			//printf("2\n");
			chaN = traintype[i];
			ISInCh = 1;
			pthread_mutex_unlock(&lockN);
		}
		if(0 == ISInCh) i--;
		//else printf("%d\n",i);
		sleep(1);
	}
	while(chaQ >= 0 || chaN >= 0);
	sleep(2);
 
	pthread_mutex_destroy(&lockMN);
	pthread_mutex_destroy(&lockMQ);
	pthread_mutex_destroy(&lockN);
	pthread_mutex_destroy(&lockQ);
	return 0;
}
pthread_mutex_t lockMN;
pthread_mutex_t lockMQ;
pthread_mutex_t lockN;
pthread_mutex_t lockQ;
 
int chaQ = -1;
int chaQT = 0;
int chaN = -1;
int chaNT = 0;
 
void* TrainPrintf()
{
	while(1)
	{
		//printf("\033[A");
		if(0 > chaQ)
			printf("快速隧道状态:空闲\n");
		else if(1 == chaQ)
			printf("快速隧道状态:复兴号,%d秒后通过\n",chaQT);
		else
			printf("快速隧道状态:错误\n");
		//
		if(0 > chaN)
			printf("普通隧道状态:空闲\n");
		else if(0 == chaN)
			printf("普通隧道状态:绿皮,%d秒后通过\n",chaNT);
		else if(1 == chaN)
			printf("普通隧道状态:复兴号,%d秒后通过\n",chaNT);
		else
			printf("普通隧道状态:错误\n");
		fflush(stdout);
		sleep(1);
		printf("\033[A\033[K");
		printf("\033[A\033[K");
	}
}
void* Rnormal(void* data)
{
	while(1)
	{
		pthread_mutex_lock(&lockN);
		while(chaNT > 0)
		{
		sleep(1);
		chaNT--;
		//if(0 >= chaNT) break;
		}
		chaN = -1;
		pthread_mutex_unlock(&lockMN);
	}
}
void* Rquik(void* data)
{
	while(1)
	{
		pthread_mutex_lock(&lockQ);
		while(chaQT > 0)
		{
			sleep(1);
			chaQT--;
			//if(0 >= chaQT) break;
		}
		chaQ = -1;
		pthread_mutex_unlock(&lockMQ);
	}
 
}
int main(int argc, const char *argv[])
{
	pthread_mutex_init(&lockMN,0);
	pthread_mutex_init(&lockMQ,0);
	pthread_mutex_init(&lockN,0);
	pthread_mutex_init(&lockQ,0);
 
	pthread_mutex_lock(&lockN);
	pthread_mutex_lock(&lockQ);
	
	int traintype[5]={0,1,1,0,1};//1-复兴 0-绿皮
 
	pthread_t pid1 = 0,pid2 = 0,pidout = 0;
	if(0 != pthread_create(&pid1,0,Rnormal,0) ||
	0 != pthread_create(&pid2,0,Rquik,0)||
	0 !=pthread_create(&pidout,0,TrainPrintf,0))
	{
		pthread_detach(pid1);
		pthread_detach(pid2);
		pthread_detach(pidout);
		pthread_mutex_destroy(&lockMN);
		pthread_mutex_destroy(&lockMQ);
		pthread_mutex_destroy(&lockN);
		pthread_mutex_destroy(&lockQ);
		return -1;
	}
 
	pthread_detach(pid1);
	pthread_detach(pid2);
	pthread_detach(pidout);
	//sleep(2);
	for(int i = 0;i < 5;i++)
	{
		int ISInCh = 0;
		//检查快速隧道
		if(1 == traintype[i] && 0 == ISInCh)
		{
			if(0 == pthread_mutex_trylock(&lockMQ))
			{
				if(1 == traintype[i])chaQT = 5;
				else chaQT = 0;
				//printf("1\n");
				chaQ = traintype[i];
				ISInCh = 1;
				pthread_mutex_unlock(&lockQ);
			}
		}
		//检查普通隧道
		if(0 == pthread_mutex_trylock(&lockMN) && 0 == ISInCh)
		{
			if(0 == traintype[i]) chaNT = 20;
			else if(1 == traintype[i]) chaNT = 10;
			else chaNT = 0;
			//printf("2\n");
			chaN = traintype[i];
			ISInCh = 1;
			pthread_mutex_unlock(&lockN);
		}
		if(0 == ISInCh) i--;
		//else printf("%d\n",i);
		sleep(1);
	}
	while(chaQ >= 0 || chaN >= 0);
	sleep(2);
 
	pthread_mutex_destroy(&lockMN);
	pthread_mutex_destroy(&lockMQ);
	pthread_mutex_destroy(&lockN);
	pthread_mutex_destroy(&lockQ);
	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值