Linux系统编程——生产者与消费者(二)

来源:互联网 发布:网络公开课 编辑:程序博客网 时间:2024/05/22 12:50

上篇博客是用信号量实现了这个问题,这里我用条件变量来实现这个问题:

/*借助条件变量模拟 生产者-消费者 问题*/#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <stdio.h>/*链表作为公享数据,需被互斥量保护*/struct msg {    struct msg *next;    int num;};struct msg *head;struct msg *mp;/* 静态初始化 一个条件变量 和 一个互斥量*/pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;void *consumer(void *p){    for (;;) {        pthread_mutex_lock(&lock);        while (head == NULL) {           //头指针为空,说明没有节点    可以为if吗            pthread_cond_wait(&has_product, &lock);        }        mp = head;              head = mp->next;    //模拟消费掉一个产品        pthread_mutex_unlock(&lock);        printf("-Consume ---%d\n", mp->num);        free(mp);        mp = NULL;        sleep(rand() % 5);    }}void *producer(void *p){    for (;;) {        mp = malloc(sizeof(struct msg));        mp->num = rand() % 1000 + 1;        //模拟生产一个产品        printf("-Produce ---%d\n", 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;}


0 0
原创粉丝点击