【发布时间】:2014-11-26 19:21:18
【问题描述】:
我试图判断生产者进程何时访问共享的 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 中更容易构建。
【问题讨论】:
-
也使用事件 (
CreateEvent),生产者可以设置它,让您的其他进程知道是时候处理数据了。 -
其实根据生产者的写法,你的代码可能会死锁。
-
这是一种根本性的破坏方法。您不仅会烧掉 100% 的内核,还可能完全错过看到另一个线程实际获取和释放互斥锁的情况。没有办法,你需要重新设计你的方法。
-
我知道这种方法很糟糕。事件会更好100%。但我想完全避免更改生产者代码。我的问题可能措辞不好。我的意思是,是否有一种方法可以判断互斥锁何时被锁定/解锁,而无需像我给出的示例那样做一些愚蠢的事情。
-
您可以检查“关联数据”以查看是否有任何变化,而不是检查互斥锁?您已经有了“处理”,所以我假设您可以访问生成的数据。问题是,数据是什么形式的,你能检测出是否产生了新数据吗?如果您认为产生了新数据,您可以获取互斥体并处理数据。