私は Windows OS を学んでいて、標準的なコンシューマー プロデューサーの問題を書いていました。リソースカウント用のセマフォと同期用のミューテックスがあります。CreateSemaphore() で最大カウント 50 の値を渡したので、プロデューサーが 50 を超えるリソースを作成できないようにする必要があります。しかし、コードを実行しているときは、それをはるかに超えています。max count 引数の使用を間違って理解しましたか?? コードも貼っておきます。この問題を解決するのを手伝ってください。
#include<stdio.h>
#include<windows.h>
DWORD WINAPI consumerThread(LPVOID args);
DWORD WINAPI producerThread(LPVOID args);
int shared;
HANDLE hMutex;
HANDLE hSemaphore;
HANDLE hConsumer;
HANDLE hProducer;
DWORD dwConsumerId,dwProducerId;
#define MAX_COUNT 50
#define MIN_COUNT 0
int main()
{
if(!(hMutex=CreateMutex(NULL,0,NULL)))
{
puts("Error:: unable to create Mutex!!");
ExitProcess(GetLastError());
}
if(!(hSemaphore=CreateSemaphore(NULL,MIN_COUNT,MAX_COUNT,NULL)))
{
puts("Error:: unable to create Semaphore object!!");
ExitProcess(GetLastError());
}
if(!(hConsumer=CreateThread(NULL,0,consumerThread,NULL,0,&dwConsumerId)))
{
puts("Error:: unable to create consumer Thread!!");
ExitProcess(GetLastError());
}
if(!(hProducer=CreateThread(NULL,0,producerThread,NULL,0,&dwProducerId)))
{
puts("Error:: unable to create producer Thread!!");
ExitProcess(GetLastError());
}
WaitForSingleObject(hConsumer,INFINITE);
WaitForSingleObject(hProducer,INFINITE);
CloseHandle(hMutex);
CloseHandle(hSemaphore);
CloseHandle(hConsumer);
CloseHandle(hProducer);
return 0;
}
DWORD WINAPI consumerThread(LPVOID args)
{
while(1)
{
WaitForSingleObject(hSemaphore,INFINITE);
WaitForSingleObject(hMutex,INFINITE);
shared--;
printf("Consumer = %d\n",shared);
ReleaseMutex(hMutex);
//Sleep(1000);
}
}
DWORD WINAPI producerThread(LPVOID args)
{
if(!SetThreadPriority(hProducer,THREAD_PRIORITY_HIGHEST))
{
printf("Error:: Unable to set the thread priority level!!\n");
ExitProcess(GetLastError());
}
while(1)
{
WaitForSingleObject(hMutex,INFINITE);
shared++;
printf("Producer =%d\n",shared);
ReleaseMutex(hMutex);
ReleaseSemaphore(hSemaphore,1,NULL);
}
}