手册页表示,这个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之后,它会解锁互斥对象吗?
发布于 2020-12-12 10:48:29
创建线程时不需要有条件-- .In互斥--一次只能运行一个关键区域。一个进程保持在关键区域有限的时间内,当它完成其工作时,没有一个进程停留在关键区域,然后使用条件信号,另一个线程也准备运行这个关键area.All。当进程停止在关键块之外时,它必须避免impasse.Also,您的例子必须是:
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);
}
}可能是在程序的末尾,一些线程被卡在con_wait()上,所以需要一个广播()来释放所有线程。
发布于 2020-12-13 20:13:17
Man说,这个pthread_cond_wait原子地打开互斥锁(按照pthread_unlock_mutex),并等待条件变量cond被发送信号。
是的,就在他们说这个功能之后
将被调用线程或未定义的行为结果锁定互斥锁。
(强调后加)。你接着说,
任何其他线程都可以输入线程start_function,从而导致两个线程处于临界块中。
如果您通过调用pthread_cond_wait()来调用未定义的行为而不包含指定的互斥对象,那么任何事情都可能发生--该行为是未定义的。这种未定义的行为可能仅仅表现为两个线程同时在关键区域执行,可能会产生任何后续效应,但也有可能程序随后崩溃,或者破坏内存,或者死锁,或者在所有密码上发推信息。
,那么在上面的代码中,在它点击pthread_cond_wait之后,它会解锁互斥对象吗?
说不出来。同样,行为也是未定义的。
https://stackoverflow.com/questions/65263524
复制相似问题