3

我正在用 C++ 编写遥测系统,并且在将某些线程与标准 pthread_cond_timedwait 和 pthread_cond_broadcast 同步时遇到了一些困难。

问题是我需要一些方法让正在广播的函数知道另一个线程是否对广播起作用。

经过一番认真的搜索后,我决定我可以尝试为这两个线程使用屏障。但是,我仍然想要 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;
}

我的问题:是与广播公司共享信息的另一种方式,还是障碍真的是唯一有效的方式?另外,是否有另一种方法可以通过障碍获得超时功能?

4

1 回答 1

2

根据您描述的问题:

具体来说,我试图让 thread1 知道它正在等待的消息已被 thread2 解析并存储在全局列表中,并且 thread2 可以继续解析和存储,因为 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);
于 2012-08-01T10:59:30.767 回答