在线程中调用pthread_cond_wait会解锁互斥锁吗

bttbmeg0  于 2023-05-16  发布在  其他
关注(0)|答案(2)|浏览(219)

手册页上说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时,它会解锁互斥锁?

pqwbnv8z

pqwbnv8z1#

手册页上说pthread_cond_wait会自动解锁互斥锁(与pthread_unlock_mutex相同),并等待条件变量cond发出信号
是的,就在他们说那个功能

应在调用线程锁定互斥锁的情况下调用或未定义行为结果。

(强调部分另加)。你接着说,
但是线程start_function可能被任何其他线程进入,导致两个线程处于临界块中。
如果您通过调用pthread_cond_wait()来调用undefined行为,而没有持有指定的互斥锁,那么 * 任何事情 * 都可能发生--行为是undefined的。有可能未定义的行为仅仅表现为两个线程同时在临界区域中执行,无论后续效果如何,但也有可能程序崩溃,然后或稍后,或损坏内存,或死锁,或tweets所有密码,在众多可能性中。
所以在上面的代码中,当它遇到pthread_cond_wait时,它会解锁互斥锁?
不好说。同样,行为是未定义的。

e5njpo68

e5njpo682#

创建线程时不需要有条件。在互斥中,一次只能有一个进程运行关键区域。一个进程在临界区停留有限的时间,当它完成了它的工作,没有一个进程停留在临界区,然后有了条件信号,另一个线程也准备好运行这个临界区。所有这些工作都是为了避免僵局。此外,当一个进程在临界块之外停止时,它不能与其他进程交互。所以你的例子应该是:

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()来释放所有线程

相关问题