为什么pthread_cond_wait需要互斥锁为参数

来源:互联网 发布:淘宝大学开网店 编辑:程序博客网 时间:2024/06/15 19:47

呃。。本人新人,下面只是我的猜想,如果有大神指错就更好了

    先必须知道如下:

    对于多线程条件变量,其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;
}

0 0
原创粉丝点击