zoukankan      html  css  js  c++  java
  • 线程相关函数(6)-pthread_cond_wait(),pthread_cond_signal(), 条件变量

    pthread_cond_t
    pthread_cond_init
    pthread_cond_destroy
    pthread_cond_wait
    pthread_cond_timedwait
    pthread_cond_signal
    pthread_cond_broadcast

    生产者消费者模型:

    #include <pthread.h>
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <time.h>
    
    struct msg {
        struct msg *next;
        int num;
    };
    
    
    struct msg *head;
    pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;
    static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
    
    
    void *consumer(void *p)
    {
        struct msg *mp;
        for(;;) {
            pthread_mutex_lock(&lock);
            while (head == NULL)
                pthread_cond_wait(&has_product, &lock);
            mp = head;
            head = mp->next;
            pthread_mutex_unlock(&lock);
            printf("Consume %d
    ", mp->num);
            free(mp);
            sleep(rand() % 5);    
        }
    }
    
    void *producer(void *p)
    {
        struct msg *mp;
        for(;;) {
            mp = malloc(sizeof(struct msg));
            mp->num = rand() % 1000 + 1;
            printf("Produce %d
    ", mp->num);
            pthread_mutex_lock(&lock);
            mp->next = head;
            head = mp;
            pthread_mutex_unlock(&lock);
            pthread_cond_signal(&has_product);
            sleep(rand() % 5);
        }
    }
    
    int main()
    {
        pthread_t pid, cid;
    
        srand(time(NULL));
        pthread_create(&pid, NULL, producer, NULL);
        pthread_create(&cid, NULL, consumer, NULL);
        pthread_join(pid, NULL);
        pthread_join(cid, NULL);
        return 0;
    }

    运行结果:

    Produce 1
    Consume 1
    Produce 22
    Produce 756
    Consume 756
    Produce 909
    Produce 941
    Consume 941
    Consume 909
    Consume 22
    Produce 307
    Produce 667
    Produce 567
    Produce 609
    Consume 609
    Produce 892
    Consume 892
    Produce 883

    ...

  • 相关阅读:
    JS实现在线ps功能
    Vmware 下安装linux虚拟机
    一文了解:Redis主从复制
    一文了解:Redis过期键删除策略
    一文了解:Redis的AOF持久化
    一文了解:Redis的RDB持久化
    一文了解:Redis事务
    一文了解:Redis基础类型
    并发一:Java内存模型和Volatile
    干了这杯java之ThreadLocal
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/8268489.html
Copyright © 2011-2022 走看看