永发信息网

生产者消费者代码

答案:1  悬赏:60  手机版
解决时间 2021-02-23 16:55
  • 提问者网友:别再叽里呱啦
  • 2021-02-22 22:17
#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]]

不知道为什么没有实现互斥
最佳答案
  • 五星知识达人网友:雾月
  • 2021-02-22 23:16
首先是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;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯