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

    ...

  • 相关阅读:
    Largest Rectangle in Histogram
    Valid Sudoku
    Set Matrix Zeroes
    Unique Paths
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Path Sum II
    Path Sum
    Validate Binary Search Tree
    新手程序员 e
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/8268489.html
Copyright © 2011-2022 走看看