根据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)
并行。
我认为应该避免这种结构以保证安全(双向)
在该互斥锁和条件变量之间形成的动态绑定
有人可以评论这个问题吗?
答案 0 :(得分:10)
对于多个条件变量使用相同的互斥量是完全没问题的,只是反过来。
考虑这一点的一种方法是:pthread_cond_wait
的合同的一部分是,当调用线程从其等待中唤醒时,它将拥有锁定的互斥锁,这只有在只有一个互斥锁关联时才有意义条件变量。
要了解您可能想要执行此操作的原因,请设想一个设计,其中有一些全局计数器受单个互斥锁保护(用户数,打开文件数等)。然后你可以合理地拥有你可能想要等待的多个条件变量,所有这些变量都与该单个互斥锁相关联:
pthread_cond_wait(&usercount_lessthan_limit_cond, &global_mutex);
...
pthread_cond_wait(&openfilecount_lessthan_limit_cond, &global_mutex);
...etc...