您的位置:首页 > 编程语言

多线程编程:深度理解 条件变量的激发与等待

2017-03-16 16:03 92 查看
条件变量的激发与等待



pthread_cond_signal激活一个等待该条件的线程,taxi_001到了站台一看没人(没有等待该条件的线程),触发的条件变量被直接复位,于是taxi_001排在等待队列里面。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <iostream>
#include <pthread.h>
using namespace std;

/*提示出租车到达的条件变量*/
pthread_cond_t taxiCond = PTHREAD_COND_INITIALIZER;
/*同步锁*/
pthread_mutex_t taxiMutex = PTHREAD_MUTEX_INITIALIZER;

int travelerCound=0;

void * traveler_arrive(void * name){
cout<<"Traveler: "<<(char *)name<<" needs a taxi now!"<<endl;
pthread_mutex_lock(&taxiMutex);
travelerCound++;
pthread_cond_wait(&taxiCond,&taxiMutex);
pthread_mutex_unlock(&taxiMutex);
cout<<"Traveler: "<<(char *)name<<" now got a taxi!"<<endl;
travelerCound--;
pthread_exit((void*)0);
}

void * taxi_arrive(void * name){
cout<<"Taxi: "<<(char *)name<<" arrives."<<endl;
while(1){
pthread_mutex_lock(&taxiMutex);
if(travelerCound>0){
pthread_cond_signal(&taxiCond);

pthread_mutex_unlock(&taxiMutex);
break;
}
pthread_mutex_unlock(&taxiMutex);
}
pthread_exit((void*)0);
}

int main(){
pthread_t tids[6];
int iRet = pthread_create(&tids[0],NULL,taxi_arrive,(void*)(" taxi_001 "));
if(iRet){
printf("pthread_create error: iRet=%d\n",iRet);
return iRet;
}
printf("Time passing by.\n");
sleep(2);
iRet = pthread_create(&tids[1],NULL,traveler_arrive,(void*)(" Susan "));
if(iRet){
printf("pthread_create error: iRet=%d\n",iRet);
return iRet;
}
printf("2 seconds have  passed.\n");
sleep(3);
iRet = pthread_create(&tids[2],NULL,taxi_arrive,(void*)(" taxi_002 "));
if(iRet){
printf("pthread_create error: iRet=%d\n",iRet);
return iRet;
}
printf("3 seconds have  passed.\n");
sleep(6);

iRet = pthread_create(&tids[3],NULL,traveler_arrive,(void*)(" Cong "));
if(iRet){
printf("pthread_create error: iRet=%d\n",iRet);
return iRet;
}
printf("6 seconds have  passed..\n");
sleep(5);

iRet = pthread_create(&tids[4],NULL,traveler_arrive,(void*)(" Ting "));
if(iRet){
printf("pthread_create error: iRet=%d\n",iRet);
return iRet;
}
printf("5 seconds have  passed.\n");

sleep(10);
iRet = pthread_create(&tids[5],NULL,taxi_arrive,(void*)(" taxi_003 "));
if(iRet){
printf("pthread_create error: iRet=%d\n",iRet);
return iRet;
}
printf("6 seconds have  passed..\n");
void *retval;
for(int i=0;i<6;i++){
iRet=pthread_join(tids[i],&retval);
if (iRet){
printf("pthread_join error: iRet=%d\n",iRet);
return iRet;
}
printf("retval=%ld\n",(long)retval);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: