實現三條執行緒,分別列印A,B,C,但是看到輸出來的結果是ABCABC……

凮夼發表於2020-11-20

剛出來找工作,面試官問我怎麼實現三條執行緒,分別列印A,B,C,但是看到輸出來的結果是ABCABC……這樣子,當時我第一反應是用訊號量呀。他反問那你需要創多少個?沒細想,其實三個就行了(有名訊號量的話),那語氣我還以為不行。又想了一會說訊號(signal)可以吧,他說可以,但是我用的又不太熟呀,除錯著寫估計能成,現場說不出來……最後問了其他人,原來那面試官想要我用條件變數和互斥鎖來實現……我會呀,說個思路完全沒問題,但是可能需要翻資料琢磨著寫,太久不用了……就想吐槽,能不能好好說話,就不能提示一下,你如果用條件變數來實現呢?……回來馬上就寫了出來,越想越不太對呀,理論上訊號,SPI物件都是用來執行緒間交流的呀,它關鍵不就等一個執行緒操作完通知下一個嘛?我這個思路沒問題呀

三條執行緒輪流列印ABC

C語言,條件變數互斥鎖實現

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


pthread_mutex_t m;  //互斥鎖
pthread_cond_t  v;  //條件變數
int input = 0; //列印埠就緒

void *thread1(void *args)
{
    pthread_mutex_lock(&m); //上鎖

    for(int i=0;i<10; i++)
    {
        while(input != 1)
            pthread_cond_wait(&v, &m);  //否則,進入等待佇列,自帶解鎖

        printf("A\n");  //列印
        input = 2;
        pthread_cond_broadcast(&v);   //喚醒所有執行緒
    }
    pthread_mutex_unlock(&m);   //解鎖

    return NULL;
}

void *thread2(void *args)
{
    pthread_mutex_lock(&m); //上鎖
    for(int i=0;i<10; i++)
    {
        while(input != 2)
            pthread_cond_wait(&v, &m);  //否則,進入等待佇列

        printf("B\n");  //列印
        input = 3;
        pthread_cond_broadcast(&v);   //喚醒所有執行緒
    }
    pthread_mutex_unlock(&m);   //解鎖

    return NULL;
}

void *thread3(void *args)
{
    pthread_mutex_lock(&m); //上鎖

    for(int i=0;i<10; i++)
    {
        while(input != 3)
            pthread_cond_wait(&v, &m);  //否則,進入等待佇列

        printf("C\n");  //列印
        input = 1;
        pthread_cond_broadcast(&v);   //喚醒所有執行緒
    }
    pthread_mutex_unlock(&m);   //解鎖

    return NULL;
}


int main()
{
    printf("Input ABC text\n");

    //初始化互斥鎖和條件變數
    pthread_mutex_init(&m, NULL);
    pthread_cond_init(&v, NULL);

    //開啟列印開關,通知所有在條件佇列的執行緒
    pthread_mutex_lock(&m);
    input = 1;    //開啟埠
    pthread_cond_signal(&v);
    pthread_mutex_unlock(&m);

    //建立3條執行緒,並等待其結束
    pthread_t tid1, tid2, tid3;
    pthread_create(&tid1, NULL, thread1, NULL);
    pthread_create(&tid2, NULL, thread2, NULL);
    pthread_create(&tid3, NULL, thread3, NULL);
    
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    pthread_join(tid3, NULL);

    //銷燬互斥鎖和條件變數
    pthread_mutex_destroy(&m);
    pthread_cond_destroy(&v);

    //退出
    return 0;
}

相關文章