在将一些 QT GUI 线程(一个 pthread 线程)与一些 C 代码连接的上下文中,我偶然发现了以下问题:我启动了 QT Gui 线程,并且在我的 C 线程恢复其路径之前,我需要确保所有QT Gui 线程内的图形对象已经被构建并且它们是有效的 QObjects(因为 C 代码将调用QObject:connect()
这些对象)。
抛开介绍不谈,等待是通过pthread_cond_wait()
C 线程中的一个 + 一个条件变量 + 一个关联的互斥锁进行的:
int isReady=0;
pthread_mutex_lock(&conditionReady_mutex);
while(isReady==0) {
pthread_cond_wait(&conditionReady_cv, &conditionReady_mutex);
}
pthread_mutex_unlock(&conditionReady_mutex);
另一方面,QT Gui 线程构造它的图形对象,然后用以下方式发出信号:
pthread_mutex_lock(&conditionReady_mutex);
isReady=1;
pthread_cond_broadcast(&conditionReady_cv);
pthread_mutex_unlock(&conditionReady_mutex);
如您所见,基本的东西。但问题是:在 Qt Gui 线程中,我一直在使用pthread_cond_broadcast()
, 以确保我的 C 线程被唤醒,这是肯定的。是的,在我目前的应用程序中,我只有一个 C 线程和一个 Qt Gui 线程,并且pthread_cond_signal()
应该做唤醒 C 线程的工作(因为它保证至少唤醒一个线程,而 C 线程是唯一的一)。
但是,在更一般的情况下,假设我有三个 C 线程,但我希望唤醒其中的一个(或两个)。一(两个)特定线程。我如何确保这一点?
如果我使用pthread_cond_signal()
,那可能只会唤醒第三个线程,这将完全错过重点,因为我感兴趣的一个线程没有被唤醒。OTOH,通过 唤醒所有线程,甚至是那些不需要的线程,pthread_cond_broadcast()
这将是矫枉过正。
有没有办法告诉pthread_cond_signal()
唤醒哪个线程?
或者,我是否应该引入更多条件变量以便对被唤醒的线程组有更精细的粒度pthread_cond_broadcast()
?
谢谢你。