我使用事件为生产者消费者问题编写了代码。问题在于,使用者线程正在接管生产者线程,而该线程处于死锁状态。但是该代码与互斥锁可以正常工作。请让我知道问题出在哪里。
我假设最大缓冲区大小为50。
#include<stdio.h>
#include<Windows.h>
#include<WinBase.h>
int Buffersize=0;
HANDLE datanew;
void producer()
{
while(1)
{
if(Buffersize==50)
{
Sleep(1000);
}
printf("\n Inside the producer routine ");
Buffersize++;
printf("\n Number of Items in the buffer = %d",Buffersize);
SetEvent(datanew);
}
}
void consumer()
{
while(1)
{
if(Buffersize==0)
{
Sleep(1000);
}
printf("\n Inside the consumer routine ");
if (WaitForSingleObject(datanew,INFINITE) == WAIT_OBJECT_0){
Buffersize--;
ResetEvent(datanew);
printf("\n Number of Items in the buffer = %d",Buffersize);
}
}
int main()
{
DWORD idprod,idcons;
HANDLE datanew=CreateEvent(NULL,TRUE,TRUE,NULL);
HANDLE threadarray[2];
HANDLE prodhnd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)producer,0,0,&idprod);
HANDLE conshnd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)consumer,0,0,&idcons);
threadarray[0]=prodhnd;
threadarray[1]=conshnd;
WaitForMultipleObjects(2,threadarray, TRUE, INFINITE);
for(int i=0; i<2; i++)
{
CloseHandle(threadarray[i]);
}
}
最佳答案
永远不会分配全局互斥锁datanew
。在main()
中,您将互斥锁分配给名为datanew
的局部变量,而不是全局datanew
。因此producer()
和consumer()
没有同步。
从main()中的HANDLE
行中删除HANDLE datanew=CreateEvent(NULL,TRUE,TRUE,NULL);
。
关于c - 生产者消费者计划陷入僵局,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17632369/