linux編程之條件變量

Linux下條件變量pthread_cond_t在使用的時候必須要配合一把互斥鎖pthread_mutex_t來使用,爲什麼會這樣呢?其實我們自己想辦法做一個條件變量,要達到條件變量的效果,也是必須加互斥鎖才能完成的。

假如,有這樣一個場景,一個讀線程、一個寫線程,一個設置標記線程。當設置標記線程將標記更改爲true時,我們允許讀、寫線程工作,否則讓讀、寫線程等待。

首先我們不適用系統提供的條件變量,自己想辦法實現一個類似條件變量功能的方法,

首先我們需要設立一個全局變量,flag,當該變量值爲true時,讀寫線程開始工作,當該值爲false時,讀寫線程等待。爲了保證對flag變量操作的原子性,我們必須準備一個互斥鎖mutex用來保護flag變量。

在上面這個例子中flag就類似與pthread_cond_t,我們準備的mutex類似與pthread_mutex_t,要實現條件變量作用,這兩個變量必須配合工作,才能達到效果。

下面我們給一段,Linux下使用條件變量的案例程序:

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

pthread_mutex_t period_lock;
pthread_cond_t period_cond;

void *read_thread(void *arg)
{
    while(1)
    {
        pthread_mutex_lock(&period_lock);
        printf("read thread lock period_lock.\n");
        pthread_cond_wait(&period_cond, &period_lock);
        printf("read thread start work. \n");
        printf("read thread end work. \n");

        pthread_mutex_unlock(&period_lock);
        printf("read thread unlock period_lock.\n");
    }
}

void *write_thread(void *arg)
{
    while(1)
    {
        pthread_mutex_lock(&period_lock);
        printf("write thread lock period_lock.\n");
        pthread_cond_wait(&period_cond, &period_lock);
        printf("write thread start work. \n");
        printf("write thread end work. \n");
        pthread_mutex_unlock(&period_lock);
        printf("write thread unlock period_lock.\n");
    }
}

void *modify_period_thread(void *arg)
{
    while(1)
    {
        printf("\n\n\n \n");
        pthread_mutex_lock(&period_lock);
        printf("modify period thread lock period_lock. \n");
        printf("modify thread start work. \n");
        printf("modify thread end work. \n");
        pthread_cond_broadcast(&period_cond);
        printf("modify thread send signal. \n");
        pthread_mutex_unlock(&period_lock);
        printf("modify period thread unlock period_lock. \n");
        
        usleep(3 * 1000 * 1000);
    }
}

int main(void)
{
    pthread_t tid_read, tid_write, tid_modify_period;

    pthread_mutex_init(&period_lock, NULL);
    pthread_cond_init(&period_cond, NULL);

    printf("start create thread. \n");
    pthread_create(&tid_read, NULL, read_thread, NULL);
    pthread_create(&tid_write, NULL, write_thread, NULL);
    pthread_create(&tid_modify_period, NULL, modify_period_thread, NULL);
    printf("end create thread. \n");

    sleep(10);
    pthread_exit(0);

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章