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连续地线程和访问关键部分(以重新评估条件).
如果我理解正确,则您希望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这是另一种方式,因为无论有多少线程调用该函数,它只会运行一次函数。