- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个进程,一个写入内存映射文件 - 生产者
- 而另一个从内存文件读取 - 消费者
。
第一个进程使用 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=TRUE
和 N
通过 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/
我有两个进程,一个写入内存映射文件 - 生产者 - 而另一个从内存文件读取 - 消费者。 第一个进程使用 CreateMutex() 函数创建互斥锁,并将 initialOwner 参数设置为 TRU
我是一名优秀的程序员,十分优秀!