pthread_cond_broadcast使用示例

今天在使用pthread_cond_t時,發現pthread_cond_t使用pthread_cond_broadcast函數喚醒多個條件變量時,使用兩個互斥量分別控制時,只能喚醒其中一個變量,最後通過測試發現只能使用一個互斥量去控制。
個人理解:
thread1中使用pthread_mutex_lock(&mutex1);加互斥所,然後在pthread_cond_wait(&cond, &mutex1);這樣可以保證這期間沒有pthread_cond_broadcast或者pthread_cond_signal操作,從而保證條件不會丟失,當pthread_cond_wait(&cond, &mutex1);
完成操作之後,會自動釋放互斥量。
然後thread2中的互斥量也緊接着根據上述方式加入等待對列,當調用pthread_cond_broadcast時會根據加入等待隊列中的先後順序依次喚醒他們。當是還是不明白爲什麼使用兩個互斥量就只能喚醒其中一個呢?有清楚的朋友可以留言。

#include <stdio.h>
#include <pthread.h>

static pthread_cond_t cond;
static pthread_mutex_t mutex1;
static pthread_mutex_t mutex2;
void *thread1_entry(void *arg)
{
        while(1)
        {
                pthread_mutex_lock(&mutex1);
                printf("cond wait cond1\n");
                pthread_cond_wait(&cond, &mutex1);
                printf("recv cond1\n");
                pthread_mutex_unlock(&mutex1);

        }
}

void *thread2_entry(void *arg)
{
        while(1)
        {
                pthread_mutex_lock(&mutex1);
                printf("cond wait cond2\n");
                pthread_cond_wait(&cond, &mutex1);
                printf("recv cond2\n");
                pthread_mutex_unlock(&mutex1);
        }

}

void *thread3_entry(void *arg)
{
        int ret;
        while(1)
        {
                pthread_mutex_lock(&mutex1);
                pthread_mutex_lock(&mutex2);
                ret = pthread_cond_broadcast(&cond);
                if(ret < 0)
                {
                        printf("pthread_cond_broadcast error\n");
                }
                pthread_mutex_unlock(&mutex2);
                pthread_mutex_unlock(&mutex1);
                sleep(2);
        }
}
int main(void)
{
        int ret =0;
        pthread_t tid1, tid2, tid3;
        ret = pthread_cond_init(&cond, NULL);
        if(ret < 0)
        {
                printf("pthread_cond_init error\n");
        }
        ret = pthread_mutex_init(&mutex1, NULL);
        if(ret < 0)
        {
                printf("pthread_mutex_init error\n");
        }

        ret = pthread_mutex_init(&mutex2,NULL);
        if(ret < 0)
        {
                printf("pthread_mutex_init error\n");
        }

        ret=  pthread_create(&tid1, NULL, thread1_entry, NULL);
        if(ret < 0)
        {
                printf("pthread_create thread1 error\n");
        }

        ret = pthread_create(&tid2, NULL, thread2_entry, NULL);
        if(ret < 0)
        {
                printf("pthread_create thread2 error\n");
        }
        sleep(2);
        ret = pthread_create(&tid3, NULL, thread3_entry, NULL);
        if(ret < 0)
        {
                printf("pthread_create thread3 error\n");
        }
#if 0
        pthread_mutex_lock(&mutex1);
        pthread_mutex_lock(&mutex2);
        ret = pthread_cond_broadcast(&cond);
        if(ret < 0)
        {
                printf("pthread_cond_broadcast error\n");
        }
        pthread_mutex_unlock(&mutex1);
        pthread_mutex_unlock(&mutex2);
#endif
        while(1)
        {
                sleep(10000);
        }
        return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章