呃。。本人新人,下面只是我的猜想,如果有大神指错就更好了
先必须知道如下:
对于多线程条件变量,其pthread_cond_wait对同一个条件变量值能有一个有效。因为如果有多个,就会引起race condition(想想也知道:如果有多个pthread_cond_wait,那么pthread_cond_signal之后,哪个能起来呢)。
OK,有了这一点之后,就做如下推断:假如没有互斥量,那么有两个线程用不同的互斥量保护条件变量,一旦两个线程都等待同一个条件变量,就会出现如上问题。又看看pthread_cond_signal之后,只有一个条件变量,那么它就不能知道唤醒了那个锁保护的条件,因此必须加上互斥锁。
通过如上推断,看一看更加有趣的例子,如果用一个pthread_cond_signal之后,用两个锁保护的同一条件变量是否都能起来,还是编译出错呢。如果用pthread_cond_broadcast由会出现什么现象呢?
那么现在试一试:第一个编译不出错,但使出现了race condition(也就是两个都有机会执行,通过signal只唤醒了一个)。我用来两个pthread_cond_signal,发现两个都能被唤醒。用来pthread_cond_broadcast,发现也只唤醒了一个,难道用pthread_cond_broadcast只能做到唤醒具有同一个锁的的线程,经过证明发现确实如此。如下对应代码:
//相应部分可以相应改变代码
#include<stdio.h>
#include<pthread.h>
pthread_mutex_t pm_lock1;
pthread_mutex_t pm_lock2;
pthread_cond_t pc_lock;
void test1(void)
{
pthread_mutex_lock(&pm_lock1);
pthread_cond_wait(&pc_lock, &pm_lock1);
printf("test1!\n");
pthread_mutex_unlock(&pm_lock1);
return;
}
void test2(void)
{
pthread_mutex_lock(&pm_lock1);
pthread_cond_wait(&pc_lock, &pm_lock1);
printf("test2!\n");
pthread_mutex_unlock(&pm_lock1);
return;
}
int main()
{
pthread_t th1,th2;
pthread_mutex_init(&pm_lock1, NULL);
pthread_mutex_init(&pm_lock2, NULL);
pthread_cond_init(&pc_lock, NULL);
if (pthread_create(&th2, NULL, (void *)&test2, NULL)<0)
{
return -1;
}
if (pthread_create(&th1, NULL, (void *)&test1, NULL)<0)
{
return -1;
}
sleep(10);
pthread_cond_broadcast(&pc_lock);
pthread_join(th1, NULL);
pthread_join(th2,NULL);
return 0;
}