手册页说这个 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 之后,它会解锁互斥锁?
手册页说这个 pthread_cond_wait 自动解锁互斥体 (根据 pthread_unlock_mutex)并等待条件变量 发出信号.
是的,就在他们说那个功能之后
应使用调用线程锁定的互斥量调用 或未定义的行为结果。
(强调)。你接着说,
但是线程 start_function 可能是 由任何其他线程进入导致两个线程处于临界状态 块。
如果您通过调用
pthread_cond_wait()
而不持有指定的互斥量来调用未定义的行为,那么 anything 可能发生——行为是未定义的。未定义的行为有可能简单地表现为两个线程同时在临界区执行,并可能产生任何后续影响,但也有可能程序崩溃,然后或稍后,或破坏内存,或死锁,或推特你所有的密码,在各种可能性中。
所以在上面的代码中,当它到达 pthread_cond_wait 之后,它会解锁互斥锁?
说不准。同样,行为是未定义的。
创建线程时不需要条件。在互斥中,一次只有一个进程可以运行临界区。一个进程在有限时间内保留在临界区中,当它完成工作并且没有任何进程保留在临界区中时,另一个线程会发出条件信号,准备好运行该临界区。所有这些工作都是为了避免陷入僵局。此外,当进程停止在关键块之外时,它不得与其他进程交互。所以你的例子必须是:
void* start_function(){
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
// critical block or critical area
// you can use signals here
pthread_mutex_unlock(&mutex);
}
int main(){
// code to create threads
for(int i=0;i<10;i++){
pthreaf_create(x[i],&start_function,...,NULL);
}
}
可能在程序结束时,一些 pthreads 已经卡在 con_wait(),所以你需要一个 broadcast() 来释放所有线程