pthread_cond_wait()同时唤醒两个线程

use*_*195 6 c multithreading pthreads

我想更好地了解如何使用pthread_cond_wait()及其工作原理.我只想对我在本网站上看到的答案进行一些澄清.

答案是本页的最后一个回复

理解pthread_cond_wait()和pthread_cond_signal()

我想知道三个线程的外观如何.想象一下,线程1想要告诉线程2和线程3唤醒

例如

pthread_mutex_t mutex;
pthread_cond_t condition;
Run Code Online (Sandbox Code Playgroud)

线程1:

pthread_mutex_lock(&mutex);

/*Initialize things*/

pthread_mutex_unlock(&mutex);
pthread_cond_signal(&condition); //wake up thread 2 & 3

/*Do other things*/
Run Code Online (Sandbox Code Playgroud)

线程2:

pthread_mutex_lock(&mutex); //mutex lock
while(!condition){
    pthread_cond_wait(&condition, &mutex); //wait for the condition
}
pthread_mutex_unlock(&mutex);

/*Do work*/
Run Code Online (Sandbox Code Playgroud)

线程3:

pthread_mutex_lock(&mutex); //mutex lock
while(!condition){
    pthread_cond_wait(&condition, &mutex); //wait for the condition
}
pthread_mutex_unlock(&mutex);

/*Do work*/
Run Code Online (Sandbox Code Playgroud)

我想知道这样的设置是否有效.假设线程2和3依赖于线程1需要处理的一些初始化选项.

小智 5

第一:如果你想线程#1唤醒线程#2#3,就应该使用pthread_cond_broadcast.

第二:设置有效(有广播).线程#2#3计划唤醒,他们将尝试重新获取互斥锁作为唤醒的一部分.其中一个将,另一个将不得不等待互斥锁再次解锁.因此#2,#3连续地线程和访问关键部分(以重新评估条件).


pil*_*row 5

如果我理解正确,则您希望thr#2和thr#3(“工人”)阻塞,直到thr#1(“老板”)执行一些初始化。

您的方法几乎可行,但您需要广播而不是发出信号,并且缺少与条件变量分开的谓词变量。(在您引用的问题中,谓词和条件变量的命名非常相似。)例如:

pthread_mutex_t mtx;
pthread_cond_t  cv;
int             initialized = 0;  // our predicate of interest, signaled via cv

...

// boss thread
  initialize_things();
  pthread_mutex_lock(&mtx);
  initialized = 1;
  pthread_cond_broadcast(&cv);
  pthread_mutex_unlock(&mtx);
  ...

// worker threads
  pthread_mutex_lock(&mtx);
  while (! initialized) {
    pthread_cond_wait(&cv, &mtx);
  }
  pthread_mutex_unlock(&mtx);
  do_things();
Run Code Online (Sandbox Code Playgroud)

这很常见,您可能需要将互斥体/ cv /标志合并为一个抽象。(有关启发,请参阅Python的Event对象。) POSIX屏障是同步线程的另一种方式:每个线程都等到所有线程“到达”。 pthread_once这是另一种方式,因为无论有多少线程调用该函数,它只会运行一次函数。