请教如何用pthread库实现一个生产者和两个消费者模型?
1. #include <stdio.h>
2. #include <pthread.h>
3. #define BUFFER_SIZE 16 // 缓冲区数量
4. struct prodcons
5. {
6. // 缓冲区相关数据结构
7. int buffer[BUFFER_SIZE]; /* 实际数据存放的数组*/
8. pthread_mutex_t lock; /* 互斥体lock 用于对缓冲区的互斥操作 */
9. int readpos, writepos; /* 读写指针*/
10. pthread_cond_t notempty; /* 缓冲区非空的条件变量 */
11. pthread_cond_t notfull; /* 缓冲区未满的条件变量 */
12. };
13. /* 初始化缓冲区结构 */
14. void init(struct prodcons *b)
15. {
16. pthread_mutex_init(&b->lock, NULL);
17. pthread_cond_init(&b->notempty, NULL);
18. pthread_cond_init(&b->notfull, NULL);
19. b->readpos = 0;
20. b->writepos = 0;
21. }
22. /* 将产品放入缓冲区,这里是存入一个整数*/
23. void put(struct prodcons *b, int data)
24. {
25. pthread_mutex_lock(&b->lock);
26. /* 等待缓冲区未满*/
27. if ((b->writepos + 1) % BUFFER_SIZE == b->readpos)
28. {
29. pthread_cond_wait(&b->notfull, &b->lock);
30. }
31. /* 写数据,并移动指针 */
32. b->buffer[b->writepos] = data;
33. b->writepos++;
34. if (b->writepos > = BUFFER_SIZE)
35. b->writepos = 0;
36. /* 设置缓冲区非空的条件变量*/
37. pthread_cond_signal(&b->notempty);
38. pthread_mutex_unlock(&b->lock);
39. }
40.
41. /* 从缓冲区中取出整数*/
42. int get(struct prodcons *b)
43. {
44. int data;
45. pthread_mutex_lock(&b->lock);
46. /* 等待缓冲区非空*/
47. if (b->writepos == b->readpos)
48. {
49. pthread_cond_wait(&b->notempty, &b->lock);
50. }
51. /* 读数据,移动读指针*/
52. data = b->buffer[b->readpos];
53. b->readpos++;
54. if (b->readpos > = BUFFER_SIZE)
55. b->readpos = 0;
56. /* 设置缓冲区未满的条件变量*/
57. pthread_cond_signal(&b->notfull);
58. pthread_mutex_unlock(&b->lock);
59. return data;
60. }
61.
62. /* 测试:生产者线程将1 到10000 的整数送入缓冲区,消费者线
63. 程从缓冲区中获取整数,两者都打印信息*/
64. #define OVER ( - 1)
65. struct prodcons buffer;
66. void *producer(void *data)
67. {
68. int n;
69. for (n = 0; n < 10000; n++)
70. {
71. printf("%d --->\n", n);
72. put(&buffer, n);
73. } put(&buffer, OVER);
74. return NULL;
75. }
76.
77. void *consumer(void *data)
78. {
79. int d;
80. while (1)
81. {
82. d = get(&buffer);
83. if (d == OVER)
84. break;
85. printf("--->%d \n", d);
86. }
87. return NULL;
88. }
89.
90. int main(void)
91. {
92. pthread_t th_a, th_b;
93. void *retval;
94. init(&buffer);
95. /* 创建生产者和消费者线程*/
96. pthread_create(&th_a, NULL, producer, 0);
97. pthread_create(&th_b, NULL, consumer, 0);
98. /* 等待两个线程结束*/
99. pthread_join(th_a, &retval);
100. pthread_join(th_b, &retval);
101. return 0;
102. }
现在我想实现类似这样的:生产者每生产一个data,供两个消费者消费,
等这两个消费者都消费完同一个data,才能写入新的data。
另外这两个消费者同时消费,互不干扰,尽可能并发,代码应该如何写呢?
相关推荐
生产者-消费者问题的Pthread实现
操作系统实验,用Pthread实现生产者和消费者问题
Win丨linux丨操作系统实验二:生产者——消费者问题
操作系统实验二:生产者——消费者问题 1. 在Windows操作系统上,利用Win32 API提供的信号量机制,编写应用程序实现生产者——消费者问题。 2. 在Linux操作系统上,利用Pthread API提供的信号量机制,编写应用程序实现生产者——消费者问题。 3. 两种环境下,生产者和消费者均作为独立线程,并通过empty、full、mutex三个信号量实现对缓冲进行插入与删除。 4. 通过打印缓冲区中的内容至屏幕,来验证应用程序的正确性。
(Linux C)利用多进程或多线程模拟实现生产者/消费者问题
Linux C语言 实现利用多进程或多线程模拟实现生产者/消费者问题。 (站在巨人的肩膀上)
Linux环境下C语言实现生产者消费者问题的代码
在Linux下完整C语言实现生产者消费者问题的代码。其中涉及信号量、多线程、GCC编译、PV操作等基础知识。Linux下通过gcc - o yy xxx.c -pthread,再通过./yy即可运行。
Linux线程编程之生产者消费者问题
前言 本文基于顺序循环队列,给出Linux生产者/消费者问题的多线程示例,并讨论编程时需要注意的事项。文中涉及的代码运行环境如下: 本文假定读者已具备线程同步的基础知识。 一 顺序表循环队列 1.1 顺序循环队列定义 队列是一种运算受限的先进先出线性表,仅允许在队尾插入(入队),在队首删除(出队)。新元素入队后成为新的队尾元素,元素出队后其后继元素成为队首元素。 队列的顺序存储结构使用一个数组和两个整型变量实现,其结构如下: 1 struct Queue{ 2 ElemType elem[MaxSize]; 3 i


