gpt4 book ai didi

c++ - 等待另一个进程锁定然后解锁 Win32 互斥量

转载 作者:太空宇宙 更新时间:2023-11-04 08:33:48 25 4
gpt4 key购买 nike

我试图判断生产者进程何时访问共享的 Windows 互斥锁。发生这种情况后,我需要锁定同一个互斥体并处理相关数据。 Windows 中是否有内置方式来执行此操作,除了可笑的循环?

我知道通过在生产者进程中创建自定义 Windows 事件可以实现此结果,但我想尽可能避免更改此程序代码。

我认为可以(以一种荒谬的低效方式)起作用的是这样的(注意:这不是我的真实代码,我知道这有 10 种不同的地方很不对劲;我想避免做这样的事情) :

#include <Windows.h>

int main() {
HANDLE h = CreateMutex(NULL, 0, "name");
if(!h) return -1;

int locked = 0;
while(true) {
if(locked) {
//can assume it wont be locked longer than a second, but even if it does should work fine
if(WaitForSingleObject(h, 1000) == WAIT_OBJECT_0) {
// do processing...
locked = 0;
ReleaseMutex(h);
}
// oh god this is ugly, and wastes so much CPU...
} else if(!(locked = WaitForSingleObject(h, 0) == WAIT_TIMEOUT)) {
ReleaseMutex(h);
}
}
return 0;
}

无论出于何种原因,如果有更简单的 C++ 方法,我的代码实际上就是这样。这个例子在 C 中更容易构建。

最佳答案

如果需要高效共享,您将无法避免更换生产者。您的设计存在根本性缺陷。

生产者需要能够在数据准备好被消费时向消费者发出信号,并确保它不会在数据正忙于消费时更改数据。您不能单独使用单个互斥量来做到这一点。

最好的方法是让生产者在数据就绪时设置一个事件,让消费者在数据被消费后重置事件。使用互斥锁同步对数据的访问,而不是表示数据准备就绪。

#include <Windows.h>

int main()
{
HANDLE readyEvent = CreateEvent(NULL, TRUE, FALSE, "ready");
if (!readyEvent) return -1;

HANDLE mutex = CreateMutex(NULL, FALSE, "name");
if (!mutex) return -1;

while(true)
{
if (WaitForSingleObject(readyEvent, 1000) == WAIT_OBJECT_0)
{
if (WaitForSingleObject(mutex, 1000) == WAIT_OBJECT_0)
{
// process as needed...
ResetEvent(readyEvent);
ReleaseMutex(mutex);
}
}
}

return 0;
}

如果您不能更改生产者以使用事件,那么至少向数据本身添加一个标志。生产者可以锁定互斥锁,更新数据和标志,解锁互斥锁。然后,消费者将不得不定期锁定互斥量、检查标志并在设置标志后读取新数据、重置标志并解锁互斥量。

#include <Windows.h>

int main()
{
HANDLE mutex = CreateMutex(NULL, FALSE, "name");
if (!mutex) return -1;

while(true)
{
if (WaitForSingleObject(mutex, 1000) == WAIT_OBJECT_0)
{
if (ready)
{
// process as needed...
ready = false;
}
ReleaseMutex(mutex);
}
}

return 0;
}

因此无论哪种方式,您的逻辑都必须在生产者和消费者中进行调整。

否则,如果您根本无法更改生产者,那么您别无选择,只能单独更改消费者,以便定期检查数据是否发生变化:

#include <Windows.h>

int main()
{
HANDLE mutex = CreateMutex(NULL, 0, "name");
if (!mutex) return -1;

while(true)
{
if (WaitForSingleObject(mutex, 1000) == WAIT_OBJECT_0)
{
// check data for changes
// process new data as needed
// cache results for next time...
ReleaseMutex(mutex);
}
}

return 0;
}

关于c++ - 等待另一个进程锁定然后解锁 Win32 互斥量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27157245/

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