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

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

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

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

有帮助吗?

解决方案

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

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

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

在等待方面,并且:

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

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

其他提示

如果您想要多个信号,也可以使用其他答案(也可以是伪代码)(例如,如果发出两次信号,那么两个线程可以在状态再次取消信号之前等待。)

等待方:

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

信号方面:

lock(lockobj);
++signalled;
notify(condvar);
unlock(lockobj);

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top