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

    ...

  • 相关阅读:
    产生半透明效果的步骤
    突发奇想
    特征提取
    matlab计算混淆矩阵
    feature selection
    PCA in OriginPro 8.6
    计算局部方差
    最下生成树原理
    点击图像获取RGB
    区域填充算法
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/8268489.html
Copyright © 2011-2022 走看看