執行緒同步之條件變數

2021-07-04 14:18:36 字數 1445 閱讀 9580

程序空間中有乙個儲存量a,該程序空間內存在多個執行緒,這多個執行緒都會訪問到a,或讀或寫,為了保障每個執行緒當前讀到的是正確的a而不是別的執行緒正在修改過程中的a,我們在訪問a之前需要對a進行加鎖,使得我們在訪問a的時候別的執行緒禁止訪問a,這是互斥量鎖。或者允許多個執行緒同時讀a,這是讀寫鎖。還有一種情況,有些執行緒也需要訪問a,但是它只是想在a達到某個值的時候才做一些事情,即值關心達到某種狀態下的a。比如執行緒1對a+1,執行緒2對a+1,執行緒3是檢查a是否到達10才做一些操作。如果按照互斥量的方法,**應該如下:

void *task1(void *arg)

}void *task1(void *arg)

}void *task3(void *arg)

else

pthread_mutex_unlock(&mutex);

}}

void *task1(void *arg)

}void *task1(void *arg)

}void *task3(void *arg)

/*do work*/

pthread_mutex_unlock(&mutex);

}}

這裡執行緒3呼叫pthread_cond_wait函式來等待被喚醒,此函式會對a解鎖並且進入阻塞。

下面是乙個完整的測試程式:

#include #include #include "error.c"

int count = 0;

pthread_mutex_t mutex1;

pthread_t tid1, tid2, tid3, tid4;

pthread_cond_t condcount;

void *task1(void *arg)

pthread_exit((void*)1);

}void *task2(void *arg)

pthread_exit((void*)2);

}void *task3(void *arg)

pthread_exit((void*)3);

}void *task4(void *arg)

printf("count = %d\n", count);

pthread_cancel(tid1);

pthread_cancel(tid2);

pthread_cancel(tid3);

pthread_mutex_unlock(&mutex1);

pthread_exit((void*)4);

} pthread_exit((void*)4);

}void main()

這裡解釋一下,每個執行緒處理函式裡面加上sleep的原因是,執行緒併發執行,每個執行緒分配的時間片內執行while的話會迴圈非常多此,這會導致結果太長不明顯。

執行緒同步之條件變數

1.條件變數是鎖嗎?不是鎖,但是條件變數能夠阻塞執行緒 條件變數需要和互斥鎖一起使用 互斥量 保護一塊共享資料 條件變數 引起阻塞 2.條件變數的兩個動作?當條件滿足,通知阻塞的執行緒執行緒開始工作 條件不滿足,阻塞執行緒 3.條件變數的型別 pthread cond t 4.主要函式 初始化乙個條...

執行緒同步之條件變數

條件變數不是鎖 名字上就沒有鎖字。但可以造成執行緒阻塞,通常與互斥鎖配合使用。1 條件變數 pthread cond t cond 2 函式 以下函式返回值均是成功返回0,失敗返回錯誤號 1 pthread cond init 動態初始化,配合phtread cond destroy一起使用。或者用...

Linux執行緒同步之條件變數

與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙...