2012-08-01 24 views
3

我使用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; 
} 

我的问题触发一段毫秒的事件:是与广播共享信息的另一种方式,或障碍真的是唯一有效的方法吗?另外,还有另一种获得超时功能的方法吗?

+1

什么是你真正想达到什么目的? – 2012-08-01 02:03:07

+0

很遗憾'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

+0

这就是说,当然有人等待condvar的信息并不能保证服务员实际上以某种特定的方式“行动”。这取决于你的代码的详细设计。 – 2012-08-01 02:10:22

回答

2

根据您所描述的问题:

具体来说,我试图让线程1知道它是 消息等待已解析和线程2, 存储在全局列表和线程2可以继续解析和存储,因为thread1将 现在从列表中复制该消息,确保thread2可以用新版本覆盖该消息,而不会中断thread1的 操作。

听起来好像你的问题可以通过让两个线程交替等待条件变量来解决。例如。在线程1:

pthread_mutex_lock(&mutex); 
while (!message_present) 
    pthread_cond_wait(&cond, &mutex); 
copy_message(); 
message_present = 0; 
pthread_cond_broadcast(&cond); 
pthread_mutex_unlock(&mutex); 

process_message(); 

和线程2:

parse_message(); 

pthread_mutex_lock(&mutex); 
while (message_present) 
    pthread_cond_wait(&cond, &mutex); 
store_message(); 
message_present = 1; 
pthread_cond_broadcast(&cond); 
pthread_mutex_unlock(&mutex); 
相关问题