1

我最近看到了 EventWaitHandle 在 C# 中的强大行为,并决定在姊妹应用程序中移动一些功能来做同样的事情。唯一的问题是姊妹应用程序是用 C 编写的。

没什么大不了的,我正在使用 pthreads,它有一个 pthread_cond_t 数据类型,允许发送信号。我唯一的问题是,是否有可能在等待它之前“发出信号”?

现在我的测试说不。也就是说,如果 ThreadA 在 ThreadB 等待之前触发了一个信号,那么 ThreadB 将无限期地等待。是否有另一种我可以使用的 pthread 类型更接近 C# 中 EventWaitHandle 的功能?一个对象是有信号的,这意味着第一个等待它的线程将立即通过,并将其设置为无信号。

将 pthread_cond 包装到另一个数据结构中并不难实现这一点。但同样,这个功能是否已经在 pthread 库中可用?

4

3 回答 3

4

如果您正确使用条件变量,这无关紧要。

您的代码的基本流程应该是(在伪代码中):

lock(lockobj);
while (!signalled) {
    wait(condvar);
}
signalled = false;
unlock(lockobj);

在等待侧,并且:

lock(lockobj);
signalled = true;
notify(condvar);
unlock(lockobj);

在信令方面。(当然,两侧使用的锁对象和条件变量必须相同。)希望这会有所帮助!

于 2008-09-27T07:01:35.153 回答
0

如果您想要多个信号(即,如果信号两次,则两个线程可以在状态再次取消信号之前等待)的替代答案(也在伪代码中)。

等待面:

lock(lockobj);
while (signalled != 0) {
    wait(condvar);
}
--signalled;
unlock(lockobj);

信令端:

lock(lockobj);
++signalled;
notify(condvar);
unlock(lockobj);
于 2008-09-27T07:08:26.307 回答
0

我最终只是将条件类型包装在一个新结构中,并创建了一些简单的函数来表现得与 C# 中的 EventWaitHandle 非常相似。我需要两个互斥锁来实现正确的序列化访问。

cond_mutex 用于等待条件变量,而 data_mutex 用于将状态从有信号设置为无信号。

重置模式与 C# 相同。自动或手动。这允许 event_wait_t 在等待后自动重置。或者让程序员手动调用 event_wait_reset(event_wait_t *ewh);

于 2008-09-29T02:57:17.627 回答