我正在学习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,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,consumerThread,NULL,&dwConsumerId))) { puts("Error:: unable to create consumer Thread!!"); ExitProcess(GetLastError()); } if(!(hProducer=CreateThread(NULL,producerThread,&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 = %dn",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 =%dn",shared); ReleaseMutex(hMutex); ReleaseSemaphore(hSemaphore,1,NULL); } }
在C编译器中指针的大小总是等于int的大小。 这是对的吗?
将XMLstring反序列化为对象错误:xml文档中存在错误(1,2)
/ dev / mem的mmap失败,virt_to_phys地址的参数无效,但地址是页面alignment的
在subprocess中closures打开的套接字
cin.eof()的组合键
这个问题在@Hans Passant和@Igor Tandetnik的评论中得到了回答。 主要的是,如果你尝试增加超过lmaxcount参数中指定的值的信号量的值,ReleaseSemaphore()API将会失败,而不是阻塞调用线程。 所以你应该检查它的返回值,因为我没有这样做,陷入困境。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。