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;
    }                            
  • 相关阅读:
    tar.gz文件
    Ruby Symbol
    Ruby表达式
    Linux相关命令
    Ruby file
    Tomcat优化
    修改Linux文件的所属用户和组
    Ruby String
    Ruby Range
    HTML5开源专业图像处理引擎——AlloyImage(简称AI)
  • 原文地址:https://www.cnblogs.com/zyqy/p/10798049.html
Copyright © 2011-2022 走看看