如果是多個執行緒都在等待這個條件,而同時只能有乙個執行緒進行處理,此時就必須要再次條件判斷,以使只有乙個執行緒進入臨界區處理。 這裡做了個實驗來說明:
我用到兩個消費者乙個生產者,判定條件是當佇列不為空時發訊號,消費者滿足條件,開始消費時先列印佇列的大小,然後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.主要函式 初始化乙個條...