程序間同步之條件變數 用while迴圈判斷的必要性

2021-08-18 00:01:44 字數 1712 閱讀 5169

如果是多個執行緒都在等待這個條件,而同時只能有乙個執行緒進行處理,此時就必須要再次條件判斷,以使只有乙個執行緒進入臨界區處理。 這裡做了個實驗來說明:

我用到兩個消費者乙個生產者,判定條件是當佇列不為空時發訊號,消費者滿足條件,開始消費時先列印佇列的大小,然後pop乙個產品。通過觀察列印的佇列大小來驗證為什麼需要再次判斷。

while時:

#include #include #include #include #include #include#includeusing namespace std;

/* 定義互斥量 */

pthread_mutex_t mtx;

/* 互斥量屬性 */

pthread_mutexattr_t mtx_attr;

queueproducts;

/* 條件變數 */

pthread_cond_t cond = pthread_cond_initializer;

void err_exit(const char *err_msg)

/* 執行緒函式 */

void *consumerthread1(void *arg)

cout << "子執行緒 1 產品數:" << products.size()<< endl;

products.pop();

/* 解鎖 */

pthread_mutex_unlock(&mtx);

sleep(1);

}return null;

}/* 執行緒函式 */

void *consumerthread2(void *arg)

cout << "子執行緒 2 產品數:" << products.size() << endl;

products.pop();

/* 解鎖 */

pthread_mutex_unlock(&mtx);

sleep(2);

}return null;

}int main(void)

else

products.push(index);

cout << "主線程產品數 "<0)

/* 執行緒函式 */

void *consumerthread1(void *arg)

cout << "子執行緒 1 產品數:" << products.size()<< endl;

products.pop();

/* 解鎖 */

pthread_mutex_unlock(&mtx);

sleep(1);

}return null;

}/* 執行緒函式 */

void *consumerthread2(void *arg)

cout << "子執行緒 2 產品數:" << products.size() << endl;

products.pop();

/* 解鎖 */

pthread_mutex_unlock(&mtx);

sleep(2);

}return null;

}int main(void)

else

products.push(index);

cout << "主線程產品數 "<0)

{// cout<

結論:由上述兩個實驗可知,當多個執行緒同時競爭乙個資源時,為了保證同步,必須要用迴圈判斷條件是否滿足。

程序間同步 互斥鎖與條件變數

include 互斥鎖 用於主動獲取共享資源時的互斥與等待 static pthread mutex t mutex pthread mutex initializer int pthread mutexattr init pthread mutexattr t int pthread mutexa...

執行緒同步之條件變數

程序空間中有乙個儲存量a,該程序空間內存在多個執行緒,這多個執行緒都會訪問到a,或讀或寫,為了保障每個執行緒當前讀到的是正確的a而不是別的執行緒正在修改過程中的a,我們在訪問a之前需要對a進行加鎖,使得我們在訪問a的時候別的執行緒禁止訪問a,這是互斥量鎖。或者允許多個執行緒同時讀a,這是讀寫鎖。還有...

執行緒同步之條件變數

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