永发信息网

生产者消费者代码

答案:1  悬赏:60  手机版
解决时间 2021-02-23 16:55
#include
#include
using namespace std;

#define N 12
int buffer[N];
unsigned int count = 0;
HANDLE hMutant;
HANDLE hEmpty;
HANDLE hFilled;

void Produce();
void Consume();
DWORD WINAPI Producer(LPVOID lpParam);
DWORD WINAPI Consumer(LPVOID lpParam);

int main(int argc, char* argv[])
{
HANDLE hThreadP, hThreadC;

hThreadP = CreateThread(NULL, 0, Producer, NULL, 0, NULL);
hThreadC = CreateThread(NULL, 0, Consumer, NULL, 0, NULL);
WaitForSingleObject(hThreadP, INFINITE);
WaitForSingleObject(hThreadC, INFINITE);

hMutant = CreateMutex(NULL, false, NULL);
hEmpty = CreateSemaphore(NULL, N, N, NULL);
hFilled = CreateSemaphore(NULL, 0, N, NULL);
return 0;
}

void Produce() {
cout << "Producing buffer[" << count << "]" << endl;
++count;
}

void Consume() {
--count;
cout << "Consuming buffer[" << count << "]" << endl;
}

DWORD WINAPI Producer(LPVOID lpParam) {
while (true) {
WaitForSingleObject(hEmpty, INFINITE);
WaitForSingleObject(hMutant, INFINITE);
Produce();
ReleaseMutex(hMutant);
ReleaseSemaphore(hFilled, 1, NULL);
}
return 0;
}

DWORD WINAPI Consumer(LPVOID lpParam) {
while (true) {
WaitForSingleObject(hFilled, INFINITE);
WaitForSingleObject(hMutant, INFINITE);
Consume();
ReleaseMutex(hMutant);
ReleaseSemaphore(hEmpty, 1, NULL);
}
return 0;
}
运行结果的一部分:
Producing buffer[0]
Producing buffer[0]
Consuming buffer[Producing buffer[42949672951]]

Producing buffer[2Consuming buffer[]1
]
Producing buffer[2Consuming buffer[]1
]
Producing buffer[2Consuming buffer[1]]

Consuming buffer[1Producing buffer[1]]

Consuming buffer[0Producing buffer[1]]

不知道为什么没有实现互斥
最佳答案
首先是mutex和semaphore初始化的代码放到创建线程的前面。

其实程序的互斥(mutex)和semaphore都没有问题,问题在count.
假设运行producer2次,consumer1次,producer2次,consumer1次
结果会是这样:

producer count1 显示produce0
producer count2 显示produce1
consumer count1 显示consumer1
producer count2 显示produce1
producer count3 显示produce2
consumer count2 显示consume2
所以屏幕输出是不正确的,会忽略掉0和1.

把buffer改成circuler queue, 这样当producer生产到2的时候,consumer仍然是从0开始取出。
#define N 12
int buffer[N];
int front=1;
int rear=1;
produce(item){
buffer[rear-1] = item;
rear = rear%N + 1;//从0存入buffer,当rear值为13时存入buffer0
}
consumer(*item){
*item = buffer[front-1];
front = front%N + 1;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
S346地址在哪,我要去那里办事
每天坐着为什么小腿肌肉会很僵硬,但是一按摩
柠檬树英文怎么写
形容的人句子,描写的人句子有哪些
一个简单的PLC程序我想问问
word里面怎么设置文字30行30列呢?
未来窗地址在什么地方,想过去办事
苏州天平山和灵岩山哪个好玩点
在没面子的场合怎么变被动为主动
市场批发的自封袋可以装食品吗?
用高压锅煮东西会破坏营养成分吗
长沙县粮食局这个地址在什么地方,我要处理点
大张家屯村村民委员会地址在什么地方,想过去
混凝土构件大偏压和小偏压的最本质的区别是什
太平天国运动爆发的根本原因是CA. 广西等地连
推荐资讯
昆明市呈贡区双明蔬菜种植专业合作社在哪里啊
如何在用手机拍的相片打“马赛克”
儒亿牛肉干奶食品我想知道这个在什么地方
和通社区议事监督委员会地址在什么地方,想过
东吴弄珠客/什么意思
数学逻辑问题
武家面馆在哪里啊,我有事要去这个地方
"享受"用英文怎么说?
新一派美发在什么地方啊,我要过去处理事情
re:creators14集的新的主题曲和片尾曲是什么
你还在害怕什么
请问,《天竺寺八月十五日夜桂子》的诗意思,它
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?