1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Linux学习之系统编程篇:使用条件变量实现“生产者和消费者模型”

Linux学习之系统编程篇:使用条件变量实现“生产者和消费者模型”

时间:2018-11-16 07:02:33

相关推荐

Linux学习之系统编程篇:使用条件变量实现“生产者和消费者模型”

#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <pthread.h>#include <time.h>typedef struct node // 定义生产者消费者的东西{int data;struct node* next; }Node;Node* phead = NULL; //定义头结点// 定义互斥锁和条件变量pthread_mutex_t mutex;pthread_cond_t cond;//生产者回调void* func_1(){while(1) // 一直在生产{Node* pnew = (Node*)malloc(sizeof(Node));pthread_mutex_lock(&mutex); // 加锁pnew->data = rand() % 1000;pnew->next = phead; // 头插法phead = pnew; // 更新头结点printf("生产的数值:%d\n", phead->data);pthread_mutex_unlock(&mutex); // 解锁pthread_cond_signal(&cond); // 唤醒线程sleep(rand() % 3);}return NULL; }//消费者回调void* func_2(){while(1){pthread_mutex_lock(&mutex); // 加锁if(phead == NULL){// 添加条件变量pthread_cond_wait(&cond, &mutex);}79 韩笑 记于:.01 - .03printf("消费数值:%d\n",phead->data);// 删除头结点 // 目的是造成没产品的现象Node *ptemp = phead;phead = phead->next;free(ptemp);pthread_mutex_unlock(&mutex); // 解锁}return NULL; }int main(){srand((unsigned)time(NULL)); // 生成随机数// 初始化互斥锁和条件变量pthread_mutex_init(&mutex, NULL);pthread_cond_init(&cond, NULL);// 设计:生产者和消费者都是子线程,主线程回收子线程资源,同时销毁互斥锁和条件变量pthread_t p1, p2;// 创建子线程pthread_create(&p1, NULL, func_1, NULL);pthread_create(&p2, NULL, func_2, NULL);// 回收子线程pthread_join(p1, NULL);pthread_join(p2, NULL);// 销毁互斥锁条件变量pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);return 0;}

这里我们烤炉什么时候加锁,什么时候加条件变量,什么时候唤醒线程呢?

(1)无论消费者还是生产者,在访问或生产公共资源的时候,都要“之前加锁,之后解锁”。

(2)对于消费者,条件变量在“临界区”内,视情况而定。

(3)对于生产者,当生产完毕,解锁完毕后,需要唤醒线程。

效果:生产者先生产数,然后消费者读取,当消费者读完后,睡 1~2 秒,生产者再生产,消费者再读。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。