pthread_cond_t的EventWaitHandle行为

时间:2020-03-06 14:49:09  来源:igfitidea点击:

最近,我看到EventWaitHandle在Cand中的强大行为表明,它决定在姊妹应用程序中移动某些功能来执行相同的操作。唯一的问题是姊妹应用程序是用C编写的。

没什么大不了的,我使用的是pthreads,它的pthread_cond_t数据类型可以发出信号。我唯一的问题是,是否有可能在某些东西等待之前将信号"信号化"?

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

将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)来手动完成此操作;