使用一个pthread_mutex_t并将pthread_cond_t与pthread_cond_wait()相乘

时间:2011-12-02 17:04:17

标签: unix pthreads posix mutex conditional-statements

根据Open Group Base Specifications Issue 7,IEEE Std 1003.1-2008, 单个条件变量(pthread_cond_t)不应与pthread_mutex_t中的不同互斥锁(pthread_cond_wait())一起使用,而至少有一个线程正在等待此条件变量:例如。 pthread_cond_wait(&cond1, &mutex1)不能与pthread_cond_wait(&cond1, &mutex2)并行使用:此行为未指定。

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

我认为应该避免这种结构以保证安全(双向)

  

在该互斥锁和条件变量之间形成的动态绑定

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

1 个答案:

答案 0 :(得分:10)

对于多个条件变量使用相同的互斥量是完全没问题的,只是反过来。

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

要了解您可能想要执行此操作的原因,请设想一个设计,其中有一些全局计数器受单个互斥锁保护(用户数,打开文件数等)。然后你可以合理地拥有你可能想要等待的多个条件变量,所有这些变量都与该单个互斥锁相关联:

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