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

条件变量的激发与等待

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

 

posted on 2017-03-16 16:03  杜聪  阅读(228)  评论(0)    收藏  举报

导航