生产者消费者问题
来源:互联网 发布:淘宝网秋季男装外套 编辑:程序博客网 时间:2024/05/16 08:03
最近复习了一下以前学的东西--生产者消费者问题。
生产者每生产一个product,就会添加到一个队列里,队列容量是PACKNUM(宏定义),队列满则阻塞停止生产。消费者每次会从队列里去一个product,当product被消费完了,就阻塞,让生产者工作。队列使用互斥体(mutex)互斥读写,阻塞的生产者或消费者使用条件变量(Condition Variable)唤醒。队列是基于FIFO模型读写的。
/* * File: main.c * Author: kira * * Created on 2012年4月26日, 下午3:37 */#include <stdio.h>#include <stdlib.h>#include <pthread.h>#define PACKETNUM 10struct msg{ struct msg *next; int num;};int sum = 0;struct msg *head = NULL;pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;pthread_cond_t full_product = PTHREAD_COND_INITIALIZER;pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;void *consumer(void* p){ struct msg *mp; for (;;) { pthread_mutex_lock(&lock); while (NULL == head) { printf("No products\n"); pthread_cond_wait(&has_product, &lock); } mp = head; head = mp->next; sum --; printf("Consum %d,left %d products!\n",mp->num,sum); pthread_mutex_unlock(&lock); pthread_cond_signal(&full_product); free(mp); sleep(rand()%5); }}void * producer(void* p){ for(;;) { pthread_mutex_lock(&lock); while(PACKETNUM == sum) { printf("The packet queue is full!\n"); pthread_cond_wait(&full_product,&lock); } struct msg *mp = malloc(sizeof(struct msg)); mp->num = rand()%1000 + 1; mp->next = NULL; printf("Produce a num %d.There are %d products\n",mp->num,sum); if(NULL == head) { head = mp; } else { struct msg *tmp = head; while(NULL != tmp->next) { tmp = tmp->next; } tmp->next = mp; } sum ++; pthread_mutex_unlock(&lock); pthread_cond_signal(&has_product); sleep(rand()%5); }}/* * */int main(int argc, char** argv) { pthread_t pid,cid; pthread_create(&pid,NULL,&producer,NULL); pthread_create(&cid,NULL,&consumer,NULL); pthread_join(pid,NULL); pthread_join(cid,NULL); return (EXIT_SUCCESS);}
- 生产者-消费者问题
- 生产者-消费者问题
- 生产者-消费者问题
- 操作系统:生产者-消费者问题
- 生产者与消费者问题
- 生产者-消费者问题
- 关于生产者-消费者问题
- java生产者 消费者问题
- 消费者和生产者问题
- 生产者消费者问题
- 生产者消费者问题--多线程
- 生产者-消费者同步问题
- 生产者消费者问题
- 生产者与消费者问题
- 生产者 消费者问题!
- 生产者与消费者问题
- 生产者消费者问题
- 关于生产者-消费者问题
- ssh
- 组态王6.55连接MySql数据库(笔记)
- 深入XSLT第五章--- 模板
- 三态门
- 激情燃烧的岁月我们永远不会忘记
- 生产者消费者问题
- DirectShow 视频编程
- amba和NFS的区别是什么
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- poj 2418(TreeMap)
- 【翻译】制作你的第一个HTML 5游戏
- CSS 调试的一些技巧
- IBatis之Iterate
- 利润领域还在不断增加