在线程中调用 pthread_cond_wait 是否解锁互斥量

问题描述 投票:0回答:2

手册页说这个 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 之后,它会解锁互斥锁?

c multithreading pthreads mutex
2个回答
0
投票

手册页说这个 pthread_cond_wait 自动解锁互斥体 (根据 pthread_unlock_mutex)并等待条件变量 发出信号.

是的,就在他们说那个功能之后

应使用调用线程锁定的互斥量调用 或未定义的行为结果。

(强调)。你接着说,

但是线程 start_function 可能是 由任何其他线程进入导致两个线程处于临界状态 块。

如果您通过调用

pthread_cond_wait()
而不持有指定的互斥量来调用未定义的行为,那么 anything 可能发生——行为是未定义的。未定义的行为有可能简单地表现为两个线程同时在临界区执行,并可能产生任何后续影响,但也有可能程序崩溃,然后或稍后,或破坏内存,或死锁,或推特你所有的密码,在各种可能性中。

所以在上面的代码中,当它到达 pthread_cond_wait 之后,它会解锁互斥锁?

说不准。同样,行为是未定义的。


0
投票

创建线程时不需要条件。在互斥中,一次只有一个进程可以运行临界区。一个进程在有限时间内保留在临界区中,当它完成工作并且没有任何进程保留在临界区中时,另一个线程会发出条件信号,准备好运行该临界区。所有这些工作都是为了避免陷入僵局。此外,当进程停止在关键块之外时,它不得与其他进程交互。所以你的例子必须是:

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

© www.soinside.com 2019 - 2024. All rights reserved.