Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CreateSemaphore()API中lmaxcount参数的用途是什么?_C_Windows_Visual Studio_Visual C++ - Fatal编程技术网

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

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

我正在学习Windows操作系统,我正在编写标准的消费者-生产者问题。我有一个用于资源计数的信号量和一个用于同步的互斥量。我已经在CreateSemaphore()中传递了max count 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);


    }
}
#包括
#包括
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参数。现在我该从中得到什么呢?