gpt4 book ai didi

c++ - 如果 pthread_cond_wait 自己执行锁定和解锁互斥量有什么意义?

转载 作者:行者123 更新时间:2023-11-27 23:02:14 25 4
gpt4 key购买 nike

我正在尝试了解互斥锁和条件变量之间的区别,但对以下代码感到困惑。

// Lock mutex and then wait for signal to relase mutex
pthread_mutex_lock( &count_mutex );

/*Wait while functionCount2() operates on count
mutex unlocked if condition varialbe in functionCount2() signaled. <-- so then why call pthread_mutex_unlock() 3 lines latter if it's already unlocked?*/
pthread_cond_wait( &condition_var, &count_mutex );
count++;
printf("Counter value functionCount1: %d\n",count);

pthread_mutex_unlock( &count_mutex );

根据 the docs pthread_cond_wait()“自动释放互斥量并导致调用线程在条件变量上阻塞”所以 pthread_mutex_lock( &count_mutex ); if pthread_cond_wait() 有什么意义 只是解锁它,因为 pthread_cond_wait() 已经解锁了它,所以后者调用 pthread_mutex_unlock() 有什么意义?

对我来说,如果 pthread_cond_wait() 不采用互斥量,那将是有意义的,我认为这就是它的意义所在。

最佳答案

首先让我们定义一些可能有点困惑的术语:

  • 条件:这是线程用来确定某事是否发生或是否需要完成工作的表达式。例如,条件可能是队列不为空。

  • 条件变量:这是一个同步对象,pthread 库(或类似的东西)可以让线程等待条件改变。一个线程可以“等待”一个条件变量,然后当另一个线程向该条件变量发出信号时,等待的线程将被唤醒。

请注意,“条件”与“条件变量”不同。

当使用条件变量时,线程需要检查条件(无论是什么),然后如果不满足条件,它可以等待条件变量,直到有信号表明它应该再次检查条件。

但是,这一系列事件:

  1. 检查条件
  2. 等待条件变量

本身不是原子的——如果在第 1 步和第 2 步之间另一个线程向条件变量发出信号,那么等待线程可能永远不会醒来(条件变量不记得过去发生过信号;当发出信号时它们只会取消阻塞已经在等待的线程)。为避免此问题,条件变量必须与一种模式一起使用,以确保相对于处理条件和条件变量的其他线程,这两个步骤将自动发生。该模式是:

  • 任何读取或更新条件中使用的对象的线程在执行此操作时都必须持有互斥锁。请注意,这包括可能等待条件变量的线程。
  • 等待条件变量时,检查条件并持有互斥锁的线程必须继续持有 pthread_cond_wait() 调用的互斥锁。这确保了上述步骤 1 和 2 之间的竞争条件不会发生,因为在 pthread_cond_wait() 调用准备好线程等待之前,任何更新条件的东西都无法获取互斥锁。届时,pthread_cond_wait() 函数将释放互斥量,这将允许更新线程获取互斥量并更新条件。

关于c++ - 如果 pthread_cond_wait 自己执行锁定和解锁互斥量有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26581699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com