Unix IPC之Posix信号量实现生产者消费者
采用多生产者,多消费者模型。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/** * 生产者 */ P(nempty); P(mutex); // 写入一个空闲位置 V(mutex); V(nstored); /** * 消费者 */ P(nstored); P(mutex): // 清空一个非空闲位置 V(mutex); V(nempty); |
全局性说明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#include "unpipc.h" #define NBUFF 10 #define MAXNTHREADS 100 int nitems, nproducers, nconsumers; /* read-only */ struct /* data shared by producers and consumers */ { int buff[NBUFF]; int nput; /* item number: 0, 1, 2, ... */ int nputval; /* value to store in buff[] */ int nget; /* item number: 0, 1, 2, ... */ int ngetval; /* value fetched from buff[] */ sem_t mutex, nempty, nstored; /* semaphores, not pointers */ } shared; void *produce( void *); void *consume( void *); /* end globals */ |
主函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
/* include main */ int main( int argc, char **argv) { int i, prodcount[MAXNTHREADS], conscount[MAXNTHREADS]; pthread_t tid_produce[MAXNTHREADS], tid_consume[MAXNTHREADS]; if (argc != 4) err_quit( "usage: prodcons4 <#items> <#producers> <#consumers>" ); nitems = atoi (argv[1]); nproducers = min( atoi (argv[2]), MAXNTHREADS); nconsumers = min( atoi (argv[3]), MAXNTHREADS); /* 4initialize three semaphores */ Sem_init(&shared.mutex, 0, 1); Sem_init(&shared.nempty, 0, NBUFF); Sem_init(&shared.nstored, 0, 0); /* 4create all producers and all consumers */ Set_concurrency(nproducers + nconsumers); for (i = 0; i < nproducers; i++) { prodcount[i] = 0; Pthread_create(&tid_produce[i], NULL, produce, &prodcount[i]); } for (i = 0; i < nconsumers; i++) { conscount[i] = 0; Pthread_create(&tid_consume[i], NULL, consume, &conscount[i]); } /* 4wait for all producers and all consumers */ for (i = 0; i < nproducers; i++) { Pthread_join(tid_produce[i], NULL); printf ( "producer count[%d] = %d\n" , i, prodcount[i]); } for (i = 0; i < nconsumers; i++) { Pthread_join(tid_consume[i], NULL); printf ( "consumer count[%d] = %d\n" , i, conscount[i]); } Sem_destroy(&shared.mutex); Sem_destroy(&shared.nempty); Sem_destroy(&shared.nstored); exit (0); } /* end main */ |
生产者线程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/* include produce */ void * produce( void *arg) { for ( ; ; ) { Sem_wait(&shared.nempty); /* wait for at least 1 empty slot */ Sem_wait(&shared.mutex); if (shared.nput >= nitems) { Sem_post(&shared.nstored); /* let consumers terminate */ Sem_post(&shared.nempty); Sem_post(&shared.mutex); return (NULL); /* all done */ } shared.buff[shared.nput % NBUFF] = shared.nputval; shared.nput++; shared.nputval++; Sem_post(&shared.mutex); Sem_post(&shared.nstored); /* 1 more stored item */ *(( int *) arg) += 1; } } /* end produce */ |
消费者线程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
/* include consume */ void * consume( void *arg) { int i; for ( ; ; ) { Sem_wait(&shared.nstored); /* wait for at least 1 stored item */ Sem_wait(&shared.mutex); if (shared.nget >= nitems) { Sem_post(&shared.nstored); Sem_post(&shared.mutex); return (NULL); /* all done */ } i = shared.nget % NBUFF; if (shared.buff[i] != shared.ngetval) printf ( "error: buff[%d] = %d\n" , i, shared.buff[i]); shared.nget++; shared.ngetval++; Sem_post(&shared.mutex); Sem_post(&shared.nempty); /* 1 more empty slot */ *(( int *) arg) += 1; } } /* end consume */ |
Unix IPC之Posix信号量实现生产者消费者的更多相关文章
- 【Windows】用信号量实现生产者-消费者模型
线程并发的生产者-消费者模型: 1.两个进程对同一个内存资源进行操作,一个是生产者,一个是消费者. 2.生产者往共享内存资源填充数据,如果区域满,则等待消费者消费数据. 3.消费者从共享内存资源取数据 ...
- day34 python学习 守护进程,线程,互斥锁,信号量,生产者消费者模型,
六 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完 ...
- Unix IPC之Posix消息队列(1)
部分参考:http://www.cnblogs.com/Anker/archive/2013/01/04/2843832.html IPC对象的持续性:http://book.51cto.com/ar ...
- Unix IPC之Posix消息队列(3)
struct mq_attr { long mq_flags; /* message queue flag : 0, O_NONBLOCK */ long mq_maxmsg; /* max numb ...
- Unix IPC之Posix消息队列(2)
/* Query status and attributes of message queue MQDES. */ extern int mq_getattr (mqd_t __mqdes, stru ...
- 课程设计——利用信号量实现生产者-消费者问题(java)
package cn.Douzi.ProductConsume; import java.util.LinkedList; import java.util.Queue; import java.ut ...
- Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题
前面的一片文章我们已经讲过使用信号量解决生产者消费者问题.那么什么情况下我们须要引入条件变量呢? 这里借用 http://www.cnblogs.com/ngnetboy/p/3521547.htm ...
- Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)
本文主要内容: 信号量的实现 利用信号量解决哲学家用餐问题 利用信号量解决生产者消费者问题 一.信号量的实现 1.1 信号量结构 typedef struct { int value; struct ...
- Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题
Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_close sem_destroy sem_unlink sem_wait sem_post ...
随机推荐
- python之旅:文件处理
一 文件操作及理论 1. 介绍 计算机系统分为:计算机硬件.操作系统.应用程序三部分我们用python或者其他程序,想要把数据永久的保存下来,就得写到硬盘里,但是应用程序是没有办法直接操作硬件的,这就 ...
- 1: @override
@Override是Java5的元数据,自动加上去的一个标志,告诉你说下面这个方法是从父类/接口 继承过来的,需要你重写一次,这样就可以方便你阅读,也不怕会忘记 @Override是伪代码,表示重写( ...
- C++ 实现vector<std:string> 版本
#include <iostream> #include <vector> #include <memory> #include <thread> #i ...
- PHP运算符的规律
^异或的规律:只有真真和假假位假 !非 判断失误的另一名比如true是false &只要有真都为真就是真其他都是假 $$就是左边是真的就不判断了 规律是一样的 |或只有假假都为假其他都是真
- Django 2.0.1 官方文档翻译:编写你的第一个 Django app,第六部分(Page 11)
编写你的第一个 Django app,第六部分(Page 11)转载请注明链接地址 本教程上接前面第五部分的教程.我们构建了一个经过测试的 web-poll应用,现在我们会添加一个样式表和一张图片. ...
- srpingboot2 session过期时间设置
springboot2 设置session过期的配置 server.servlet.session.timeout = 1800 而不再是 server.session.timeout=1800
- nodejs 剪切图像在上传,并保存到指定路径下(./public/img/' + req.session.token + '.jpg‘)
前jQuery端接收数据 function upAvatar(img){ console.log(img); // data:image/jpeg;base64,/9j/4AAQSkZJRgABAQA ...
- IFrame跨域处理方法-Javascript
在漫长的前端开发旅途上,无可避免的会接触到ajax,而且一般情况下都是用在同一域下的ajax请求:但是如果请求是发生在不同的域下,请求就无法执行,并且会抛出异常提示不允许跨域请求,目前我没有找到明确的 ...
- 解决IE6中 PNG图片透明的终极方案-八种方案!
“珍惜生命,远离IE6”,IE6中的bug令很多Web前端开发人员实为头疼,因此不知道烧了多少脑细胞,在众多的Bug中最令人抓狂的就是IE对png图片的不支持,导致设计师和重构师放弃了很多很炫的效果, ...
- R8—批量生成文件夹,批量读取文件夹名称+R文件管理系统操作函数
一. 批量生成文件夹,批量读取文件夹名称 今日,工作中遇到这样一个问题:boss给我们提供了200多家公司的ID代码(如6007.7920等),需要根据这些ID号去搜索下载新闻,从而将下载到的新闻存到 ...