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;
}