【问题标题】:Using one pthread_mutex_t and multiples pthread_cond_t with pthread_cond_wait()使用一个 pthread_mutex_t 和多个 pthread_cond_t 和 pthread_cond_wait()
【发布时间】:2012-01-11 16:38:03
【问题描述】:

根据开放组基本规范第 7 期,IEEE Std 1003.1-2008, 单个条件变量 (pthread_cond_t) 不应与 pthread_cond_wait() 中的不同互斥体 (pthread_mutex_t) 一起使用,而至少有一个线程正在等待此条件变量:例如。 pthread_cond_wait(&cond1, &mutex1) 不能与 pthread_cond_wait(&cond1, &mutex2) 并行使用:此行为未指定。

但未指定是否允许使用具有多个条件变量的单个互斥锁,例如:pthread_cond_wait(&cond1, &mutex1)pthread_cond_wait(&cond2, &mutex1) 并行。

我认为应该避免这种结构以保证安全(两种方式)

在互斥体和条件变量之间形成动态绑定 [...]

有人可以评论这个问题吗?

【问题讨论】:

    标签: unix pthreads posix mutex conditional-statements


    【解决方案1】:

    对多个条件变量使用同一个互斥锁是完全可以的,但反过来不行。

    考虑这一点的一种方式是:pthread_cond_wait 的部分约定是,当调用线程从等待中唤醒时,它将拥有锁定的互斥锁,这只有在只有一个互斥锁与条件相关联时才有意义变量。

    要了解您为什么要这样做,请想象一个设计,其中您有多个由单个互斥锁保护的全局计数器(用户计数、打开文件的数量等)。然后,您可以相当合理地拥有多个您可能想要等待的条件变量,所有这些都与该单个互斥锁相关联:

    pthread_cond_wait(&usercount_lessthan_limit_cond, &global_mutex);
    ...
    pthread_cond_wait(&openfilecount_lessthan_limit_cond, &global_mutex);
    ...etc...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 2010-11-16
      相关资源
      最近更新 更多