多线程编程:深度理解 条件变量的激发与等待
2017-03-16 16:03
92 查看
条件变量的激发与等待
pthread_cond_signal激活一个等待该条件的线程,taxi_001到了站台一看没人(没有等待该条件的线程),触发的条件变量被直接复位,于是taxi_001排在等待队列里面。
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; }
相关文章推荐
- 对于多线程编程的互斥锁和条件变量以及信号量的理解
- 多线程编程 深入理解JMM
- java多线程编程理解
- Linux C 多线程编程 互斥锁与条件变量
- Linux C 多线程编程 互斥锁与条件变量
- 多线程编程之————条件变量
- 多线程编程 深入理解线程对象和线程
- Linux多线程编程入门-同步机制-条件变量
- 多线程编程: 条件变量
- (转)Linux C 多线程编程----互斥锁与条件变量
- Java多线程编程总结--新特征-条件变量
- 谈谈多线程编程的个人理解(数据私有变量)
- (转载)C#多线程编程之:同步事件和等待句柄
- Linux操作系统下的多线程编程详细解析----条件变量
- Java多线程编程--(3)线程互斥、同步的理解
- Java 多线程编程之五:一个理解 wait() 与 notify() 的例子
- 【Linux C 多线程编程】互斥锁与条件变量
- 多线程编程--对pthread_cond_wait()函数的理解
- posix多线程有感--线程高级编程(条件变量)
- 转载_Linux多线程编程详细解析----条件变量 pthread_cond_t