view code
#include這個程式理想順序是主線程先進入臨界區,然後執行p#include
#include "
clthread.h
"#include "
clexecutivefunctionprovider.h
"#include "
clmutex.h
"#include "
clcriticalsection.h
"#include "
clconditionvariable.h
"using
namespace std;
struct spara
;class clmyfunction : public clexecutivefunctionprovider
virtual ~clmyfunction()
virtual clstatus runexecutivefunction(void *pcontext)
p->condition.wakeup();
return clstatus(0, 0);}};
int main()
pthread->waitfordeath();
cout << "
in main thread
"<< endl;
delete pthread;
delete myfunction;
delete p;
return
0;}
->
condition
.wait(&(
p->
mutex
))釋放互斥鎖並在條件變數上等待;接著子執行緒進入臨界區把flag置1,而後退出臨界區,最後喚醒主線程,使其繼續執行。
主線程中,臨界區為從」clcriticalsection
cs(&(
p->
mutex
))「開始,到主線程被掛起為止;子執行緒中,臨界區為從「clcriticalsection
cs(&(
p->
mutex
))」到p
->
flag被賦值為1結束。
當主線程先進入臨界區時,此時主線程已經被掛起,而子執行緒的喚醒尚未執行,故不會產生無限等待。
當子執行緒先進入臨界區時,此時p
->
flag被置1,而主線程對p
->
flag的判斷尚未執行,故主線程不會再等待條件變數。
等待執行緒的執行順序:
呼叫pthread_mutex_lock
while(判斷條件)pthread_cond_wait(while判斷等待條件是由於執行緒可能不是被pthread_cond_signal喚醒,可能是由訊號等喚醒(futex))
呼叫pthread_mutex_unlock
被等待執行緒
呼叫pthread_mutex_lock
修改條件
呼叫pthread_mutex_unlock
呼叫pthread_mutex_broadcast等
linux互斥鎖和條件變數
一 互斥鎖 1.初始化 在linux下,執行緒的互斥量資料型別是pthread mutex t.在使用前,要對它進行初始化 對於靜態分配的互斥量,可以把它設定為pthread mutex initializer,或者呼叫pthread mutex init.對於動態分配的互斥量,在申請記憶體 mal...
Linux互斥鎖和條件變數
include class thread lock thread lock void lock void unlock void wait void signal private pthread mutex t m mutex pthread mutexattr t m mutexatr pthre...
互斥量,條件變數
在程序喚醒與睡眠一文中,針對多程序的生產者 消費者問題,我們提出了基於訊號量的解決方案 該方案避免了程序在等待其要求的下一步執行條件時進入忙等待狀態 我們使用了三個訊號量,訊號量mutex用於保證生產者程序與消費者程序不會同時訪問緩衝區 訊號量empty用於保證當緩衝區滿是生產者被阻塞進入休眠狀態,...