CreateSemaphore()API中的lmaxcount参数有什么用?

我正在学习Windows操作系统,我正在编写标准的消费者制造商问题。 我有一个信号量的资源和一个互斥的同步。 我已经在CreateSemaphore()中传递了最大值50的值,所以它不应该允许生产者创build超过50个资源。 但是当我运行这个代码时,它远远超出了这个范围。 我是否理解错误地使用最大计数参数? 我也在粘贴代码。 请帮我拍这个问题。

#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); } } 

这个问题在@Hans Passant和@Igor Tandetnik的评论中得到了回答。 主要的是,如果你尝试增加超过lmaxcount参数中指定的值的信号量的值,ReleaseSemaphore()API将会失败,而不是阻塞调用线程。 所以你应该检查它的返回值,因为我没有这样做,陷入困境。 🙂