gpt4 book ai didi

c++ - 将 initialOwner 设置为 TRUE 的 CreateMutex 使创建者进程保持互斥直到完成

转载 作者:行者123 更新时间:2023-11-28 04:55:45 24 4
gpt4 key购买 nike

我有两个进程,一个写入内存映射文件 - 生产者 - 而另一个从内存文件读取 - 消费者

第一个进程使用 CreateMutex() 函数创建互斥锁,并将 initialOwner 参数设置为 TRUE

代码如下:

制作人:

mutexHandle = CreateMutex(NULL, TRUE, TEXT("producerMutex"));
while (condition)
{
WaitForSingleObject(mutexHandle, INFINITE);
// write a random number in the memory mapped file;
// pause the program and prompt the user to open consumer process; do this only one time
ReleaseMutex(mutexHandle);
}

消费者:

mutexHandle = OpenMutex(SYNCRONIZE , FALSE, TEXT("producerMutex"));
while (condition)
{
WaitForSingleObject(mutexHandle, INFINITE);
// read from the file, print it in terminal
ReleaseMutex(mutexHandle);
}

问题在于,如果 initialOwner 设置为 TRUE,则在 producer 完成之前,消费者将无法访问互斥量。这是为什么?如果将 initialOwner 设置为 FALSE,应用程序可以正常工作,但如果设置为 TRUE,它不应该也可以工作吗?

最佳答案

来自ReleaseMutex文档:

to release its ownership, the thread must call ReleaseMutex one time for each time that it obtained ownership (either through CreateMutex or a wait function).

在这段代码中:

mutexHandle = CreateMutex(NULL, TRUE, TEXT("producerMutex"));
while (condition)
{
WaitForSingleObject(mutexHandle, INFINITE);
// write a random number in the memory mapped file;
// pause the program and prompt the user to open consumer process; do this only one time
ReleaseMutex(mutexHandle);
}

您获得互斥锁 N+1 次 - 1 次通过 CreateMutex() 使用 bInitialOwner=TRUEN 通过 WaitForSingleObject() 在循环中的次数。但是你在循环中只释放了 N 次。结果,在循环之后您仍然持有互斥锁,直到线程退出。

要解决此问题,您需要跳过循环中对 WaitForSingleObject 的第一次调用 - 事实上,您已经是互斥锁的所有者,不需要此调用。你可以这样写代码:

if (mutexHandle = CreateMutex(0, TRUE, L"producerMutex"))
{
goto __firstTime;
do
{
WaitForSingleObject(mutexHandle, INFINITE);
__firstTime:
// write a random number in the memory mapped file;
ReleaseMutex(mutexHandle);
// pause the program and prompt the user to open consumer process; do this only one time
} while (condition);

CloseHandle(mutexHandle);
}

您需要在访问共享资源后立即调用 ReleaseMutex()。当您持有互斥锁时,切勿“暂停”程序。先放开,然后暂停。

关于c++ - 将 initialOwner 设置为 TRUE 的 CreateMutex 使创建者进程保持互斥直到完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47158976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com