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

    ...

  • 相关阅读:
    Eclipse慢慢学会的快捷键
    换行和flush()
    接口Interface
    对象的转型
    抽象类和抽象函数
    BufferedReader
    FileInputStream和FileReader
    Unable to instantiate receiver XXXXXX
    声明对象和定义数组
    Eclipse中文乱码问题
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/8268489.html
Copyright © 2011-2022 走看看