gpt4 book ai didi

带有 bInitialOwner=true 的 CreateMutex 似乎表现得很奇怪

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

我这里真的是一头雾水。我通读了 MSDN 文章,但仍然无法弄清楚发生了什么。我的问题是:当使用以下代码运行一些进程时,一切正常:

HANDLE m = CreateMutex(NULL, FALSE, L"MyMutex");
char c[20] = "2print";
for(int iter = 0; iter<100; ++iter) {
WaitForSingleObject(m,INFINITE);
for(int i=0;i<(int)strlen(c);++i) {
for(int j=0;j<10000;++j)
printf("%c",c[i]);
}
BOOL ok = ReleaseMutex(m);
}
CloseHandle(m);

也就是说,不同的进程各自轮流打印并释放互斥锁,直到所有打印完成。

但是将 CreateMutex 更改为:(bInitialOwner 从 FALSE 到 TRUE)

HANDLE m = CreateMutex(NULL, TRUE, L"MyMutex");

第一个创建者不会释放互斥锁!其他进程只是坐在那里。令我惊讶的是,通过添加一个额外的 releaseMutex,情况发生了变化:

BOOL ok = ReleaseMutex(m);

进入:

BOOL ok = ReleaseMutex(m);
ok = ReleaseMutex(m);

让它发挥作用!

我真的很困惑,为什么第一个创建者不正确释放互斥量?我尝试使用 GetLastError 打印所有错误,我得到的似乎是合理的,比如 ERROR_ALREADY_EXISTS 对于第一个错误之后的创作者,这正是我所期望的(MSDN 说在这种情况下 bInitialOwner 被简单地忽略了)。

最佳答案

当您使用 bInitialOwner=TRUE 时,互斥量创建者自动获取互斥量。然后当你调用WaitForSingleObject ,它再次获得了互斥锁。由于 win32 互斥锁是递归互斥锁,因此每次获取互斥锁时都必须释放一次 - 所以两个 ReleaseMutex初始创建者需要调用(但是每个其他线程只能释放一次!)

您可以通过不使用 bInitialOwner 来避免这种情况,或跳过 WaitForSingleObject仅在第一个循环 if any only if GetLastError() != ERROR_ALREADY_EXISTS .您需要调用 SetLastError(0)CreateMutex 之前如果选择后者,清除错误代码。

如果你只需要bInitialOwner对于某种初始设置,如果您在进入公共(public)循环之前删除互斥量,它将简化您的代码。否则,我强烈建议不要使用 bInitialOwner ,除非您有令人信服的理由这样做。

关于带有 bInitialOwner=true 的 CreateMutex 似乎表现得很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9253860/

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