手册页上说pthread_cond_wait会自动解锁互斥锁(与pthread_unlock_mutex相同),并等待条件变量cond发出信号。
但是线程start_function可能被任何其他线程进入,导致两个线程处于临界块中。
void* start_function(){
pthread_mutex_lock(&mutex);
// critical block
pthread_mutex_unlock(&mutex);
}
int main(){
// code to create threads
pthread_cond_wait(&cond, &mutex);
}
所以在上面的代码中,当它遇到pthread_cond_wait时,它会解锁互斥锁?
2条答案
按热度按时间pqwbnv8z1#
手册页上说pthread_cond_wait会自动解锁互斥锁(与pthread_unlock_mutex相同),并等待条件变量cond发出信号。
是的,就在他们说那个功能
应在调用线程锁定互斥锁的情况下调用或未定义行为结果。
(强调部分另加)。你接着说,
但是线程start_function可能被任何其他线程进入,导致两个线程处于临界块中。
如果您通过调用
pthread_cond_wait()
来调用undefined行为,而没有持有指定的互斥锁,那么 * 任何事情 * 都可能发生--行为是undefined的。有可能未定义的行为仅仅表现为两个线程同时在临界区域中执行,无论后续效果如何,但也有可能程序崩溃,然后或稍后,或损坏内存,或死锁,或tweets所有密码,在众多可能性中。所以在上面的代码中,当它遇到pthread_cond_wait时,它会解锁互斥锁?
不好说。同样,行为是未定义的。
e5njpo682#
创建线程时不需要有条件。在互斥中,一次只能有一个进程运行关键区域。一个进程在临界区停留有限的时间,当它完成了它的工作,没有一个进程停留在临界区,然后有了条件信号,另一个线程也准备好运行这个临界区。所有这些工作都是为了避免僵局。此外,当一个进程在临界块之外停止时,它不能与其他进程交互。所以你的例子应该是:
可能是在程序的最后,一些pthreads卡在了con_wait()上,所以需要一个broadcast()来释放所有线程