zoukankan      html  css  js  c++  java
  • 线程的条件变量实例

    情景1:

    Jack开着一辆出租车来到一个网站停车。看见没人就走了。过段时间。Susan来到网站准备乘车。可是没有来,于是就等着。过了一会Mike开着车来到了这个网站,Sunsan就上了Mike的车走了。如图所看到的:


    程序实现该情景:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <pthread.h>
    
    pthread_cond_t taxicond = PTHREAD_COND_INITIALIZER;
    pthread_mutex_t taximutex = PTHREAD_MUTEX_INITIALIZER;
    
    void *traveler_arrive(void *name)
    {
        char *p = (char *)name;
    
        printf ("Travelr: %s need a taxi now!
    ", p);
        pthread_mutex_lock(&taximutex);
        pthread_cond_wait(&taxicond, &taximutex);
        pthread_mutex_unlock(&taximutex);
        printf ("traveler: %s now got a taxi!
    ", p);
        pthread_exit(NULL);
    }
    
    void *taxi_arrive(void *name)
    {
        char *p = (char *)name;
        printf ("Taxi: %s arrives.
    ", p);
        pthread_cond_signal(&taxicond);
        pthread_exit(NULL);
    }
    
    int main (int argc, char **argv)
    {
        char *name;
        pthread_t thread;
        pthread_attr_t threadattr;
        pthread_attr_init(&threadattr);
    
        name = "Jack";
        pthread_create(&thread, &threadattr, taxi_arrive, name);
        sleep(1);
        name = "Susan";
        pthread_create(&thread, &threadattr, traveler_arrive, name);
        sleep(1);
        name = "Mike";
        pthread_create(&thread, &threadattr, taxi_arrive, name);
        sleep(1);
    
        return 0;
    } /* ----- End of main() ----- */

    情景2:

    Jack开着一辆出租车来到一个网站停车,看见没人就等着。过段时间,Susan来到网站准备乘车看见了Jack的出租车,于是就上去了。过了一会Mike开着车来到了这个网站,看见没人救等着。

    如图所看到的:


    程序实现该情景:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <pthread.h>
    
    int travelercount = 0;
    pthread_cond_t taxicond = PTHREAD_COND_INITIALIZER;
    pthread_mutex_t taximutex = PTHREAD_MUTEX_INITIALIZER;
    
    void *traveler_arrive(void *name)
    {
        char *p = (char *)name;
    
        pthread_mutex_lock(&taximutex);
    
        printf ("traveler: %s need a taxi now!
    ", p);
        travelercount++;
        pthread_cond_wait(&taxicond, &taximutex);
                
        pthread_mutex_unlock(&taximutex);
        printf ("traveler: %s now got a taxi!
    ", p);
        pthread_exit(NULL);
    }
    
    void *taxi_arrive(void *name)
    {
        char *p = (char *)name;
        printf ("Taxi: %s arrives.
    ", p);
        for(;;){
            if(travelercount){
                pthread_cond_signal(&taxicond);
                travelercount--;
                break;
            }
        }
    
        pthread_exit(NULL);
    }
    
    int main (int argc, char **argv)
    {
        char *name;
        pthread_t thread;
        pthread_attr_t threadattr;
        pthread_attr_init(&threadattr);
    
        name = "Jack";
        pthread_create(&thread, &threadattr, taxi_arrive, name);
        sleep(1);
        name = "Susan";
        pthread_create(&thread, &threadattr, traveler_arrive, name);
        sleep(3);
        name = "Mike";
        pthread_create(&thread, &threadattr, taxi_arrive, name);
        sleep(4);
    
        return 0;
    } /* ----- End of main() ----- */

    author: fulinux

    E-mail: fulinux@sina.com

    blog: blog.csdn.net/fulinus








  • 相关阅读:
    FZU 2150 Fire Game (高姿势bfs--两个起点)(路径不重叠:一个队列同时跑)
    HDU1010 Tempter of the Bone【小狗是否能逃生----DFS奇偶剪枝(t时刻恰好到达)】
    MySQL--9存储引擎
    MySQL--7MySQL自定义函数
    MySQL--5子查询与连接小结
    MySQL--4操作数据表中的记录小结
    MySQL--6运算符和函数小结
    MySQL--8MySQL存储过程小结
    Hybrid设计--如何落地一个Hybrid项目
    Hybrid设计--离线更新
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6910099.html
Copyright © 2011-2022 走看看