我使用C++编写了一个遥测系统,并且在使用标准pthread_cond_timedwait和pthread_cond_broadcast同步某些线程时遇到了一些困难。什么时候使用pthread barrier而不是条件等待和广播更合适?
问题是,我需要某种方法让正在进行广播的功能知道另一个线程是否作用于广播。
经过一番热烈的搜索后,我决定尝试为两个线程使用屏障。但是,我仍然希望pthread_cond_timedwait的超时功能。
这里基本上是我想出了:(不过感觉过度)
听功能:检查为期毫秒,以查看是否正在触发的事件。
bool listen(uint8_t eventID, int timeout)
{
int waitCount = 0;
while(waitCount <= timeout)
{
globalEventID = eventID;
if(getUpdateFlag(eventID) == true)
{
pthread_barrier_wait(&barEvent);
return true;
}
threadSleep(); //blocks for 1 millisecond
++waitCount;
}
return false;
}
触发功能:通过设置更新标志为触发期间
bool trigger(uint8_t eventID, int timeout)
int waitCount = 0;
while(waitCount <= timeout)
{
setUpdateFlag(eventID, true); //Sets the update flag to true
if(globalEventID == eventID)
{
pthread_barrier_wait(&barEvent);
return true;
}
threadSleep(); //blocks for 1 millisecond
++waitCount;
}
setUpdateFlag(eventID, false);
return false;
}
我的问题触发一段毫秒的事件:是与广播共享信息的另一种方式,或障碍真的是唯一有效的方法吗?另外,还有另一种获得超时功能的方法吗?
什么是你真正想达到什么目的? – 2012-08-01 02:03:07
很遗憾'pthread_cond_t'没有一个等价于BSD/Solaris的'cv_has_waiters()'的方法,http://www.daemon-systems.org/man/cv_has_waiters.9.html成为你需要的东西。 – 2012-08-01 02:08:07
这就是说,当然有人等待condvar的信息并不能保证服务员实际上以某种特定的方式“行动”。这取决于你的代码的详细设计。 – 2012-08-01 02:10:22