zoukankan      html  css  js  c++  java
  • 条件变量生产者和消费者模型

    生产者消费者条件变量模型

    线程同步典型的案例即为生产者消费者模型,而借助条件变量来实现这一模型,是比较常见的一种方法。假定有两个线程,一个模拟生产者行为,一个模拟消费者行为。两个线程同时操作一个共享资源(一般称之为汇聚),生产向其中添加产品,消费者从中消费掉产品。

    #include <stdlib.h>
    #include <unistd.h>
    #include <pthread.h>
    
    struct msg {
        struct msg *next;
        int num;
    };
    struct msg *head;
    //静态初始化 一个条件变量 和 一个互斥变量  可以代替init函数
    pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;
    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;
        while (1) {
            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(int argc, char *argv[])
    {
        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;
    }                            
  • 相关阅读:
    oracle 使用正则表达式获取字符串中包含的数字
    oracle 将逗号分隔的字符串转成多行记录
    sqlplus下 查看oracle 执行计划
    使用connect by 虚拟生成100条记录
    Lomsat gelral
    Legacy
    慢慢变小的序列(好题)
    Walls(扫描线)
    线段树求面积并,面积交,周长
    最小圆覆盖(随机增量||模拟退火)
  • 原文地址:https://www.cnblogs.com/zyqy/p/10798049.html
Copyright © 2011-2022 走看看