CreateSemaphore()API中lmaxcount参数的用途是什么?
我正在学习Windows操作系统,我正在编写标准的消费者-生产者问题。我有一个用于资源计数的信号量和一个用于同步的互斥量。我已经在CreateSemaphore()中传递了max count 50的值,因此它不应该允许生产者创建超过50个资源。但当我运行代码时,它远远超出了这一范围。我是否错误地理解了max count参数的用法?? 我也在粘贴代码。请帮我解决这个问题CreateSemaphore()API中lmaxcount参数的用途是什么?,c,windows,visual-studio,visual-c++,C,Windows,Visual Studio,Visual C++,我正在学习Windows操作系统,我正在编写标准的消费者-生产者问题。我有一个用于资源计数的信号量和一个用于同步的互斥量。我已经在CreateSemaphore()中传递了max count 50的值,因此它不应该允许生产者创建超过50个资源。但当我运行代码时,它远远超出了这一范围。我是否错误地理解了max count参数的用法?? 我也在粘贴代码。请帮我解决这个问题 #include<stdio.h> #include<windows.h> DWORD WINAPI
#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);
}
}
#包括
#包括
DWORD WINAPI consumerThread(LPVOID args);
DWORD WINAPI producerThread(LPVOID args);
int共享;
处理hMutex;
处理HSE信号机;
处理消费者;
手柄;
德沃德·德康塞里德、德普罗德里德;
#定义最大计数50
#定义最小计数0
int main()
{
如果(!(hMutex=CreateMutex(NULL,0,NULL)))
{
puts(“错误::无法创建互斥!!”;
ExitProcess(GetLastError());
}
if(!(hSemaphore=CreateSemaphore(NULL,最小计数,最大计数,NULL)))
{
puts(“错误::无法创建信号量对象!!”;
ExitProcess(GetLastError());
}
if(!(hConsumer=CreateThread(NULL,0,consumerThread,NULL,0,&dwconsumerrid)))
{
puts(“错误::无法创建使用者线程!!”;
ExitProcess(GetLastError());
}
if(!(hProducer=CreateThread(NULL,0,producerThread,NULL,0,&dwProducerId)))
{
puts(“错误::无法创建生产者线程!!”;
ExitProcess(GetLastError());
}
WaitForSingleObject(hConsumer,无限);
WaitForSingleObject(hProducer,无限);
密柄(hMutex);
闭合手柄(hSemaphore);
闭合手柄(hConsumer);
闭合手柄(hProducer);
返回0;
}
DWORD WINAPI用户读取(LPVOID参数)
{
而(1)
{
WaitForSingleObject(hSemaphore,无限);
WaitForSingleObject(hMutex,无限);
共享--;
printf(“消费者=%d\n”,共享);
释放互斥(hMutex);
//睡眠(1000);
}
}
DWORD WINAPI产品读取(LPVOID参数)
{
如果(!SetThreadPriority(hProducer,线程优先级最高))
{
printf(“错误::无法设置线程优先级!!\n”);
ExitProcess(GetLastError());
}
而(1)
{
WaitForSingleObject(hMutex,无限);
共享++;
printf(“生产者=%d\n”,共享);
释放互斥(hMutex);
释放信号量(hSemaphore,1,NULL);
}
}
这个问题在@Hans Passant和@Igor Tandetnik的评论中得到了回答。要点是,如果您试图将信号量的值增加到lmaxcount参数中指定的值之外,ReleaseSemaphore()API将失败,而不是阻塞调用线程。因此,您应该检查它的返回值,因为我没有这样做,所以会遇到麻烦。:) 你只是用错了信号灯。它仅在调用WFSO并达到零时阻塞。没有“最小计数”。您必须将其初始化为MAX_COUNT,并在producer中调用WFSO。并在消费者中发布。注意死锁。我明白你的意思,但是lmaxcout参数有什么用呢?为什么他们提供了两个参数,初始值和最大计数??按照您告诉我使用它的方式,我只需要一个参数,用某个值初始化它并调用WFSO??只要不检查ReleaseSemaphore()的返回值就没有意义了。当你的代码有bug并且发布得太频繁时,它会告诉你。这不是您想跳过的。@CreateEvent BinInitialState中的Igortandtnik允许我以有信号或无信号状态创建新对象,CreateMutex bInitalOwner中的Igortandtnik允许我获取互斥对象的所有权。所以所有这些都是有道理的。如果lmaxcount没有阻止线程使其进一步增加此限制,那么lmaxcount的用途是什么?“信号量对象的最大计数。此值必须大于零”这是写在MSDN文档上的lmaxcount参数。现在我该从中得到什么呢?