先上**,主要是執行緒類"clthread":
標頭檔案:
view code
#ifndef clthread_h增加一些成員變數及乙個建構函式,稍後解釋。#define clthread_h
#include
#include "
clexecutive.h
"#include "
clstatus.h
"#include "
clevent.h"/*
clthread代表了乙個執行緒,該類物件的生存期,即執行緒的生存期
該類物件必須從堆中分配,且不必呼叫delete釋放記憶體
建構函式中的bwaitfordeath用於指示是否需要等待新執行緒結束。預設
情況是不需要的。若需要則設定為true,並且需保證最後一定要呼叫
waitfordeath函式,否則資源無法釋放
run、waitfordeath函式如果返回成功,則只能呼叫一次。
*/class clthread : public clexecutive
;#endif
實現:view code
#include "m_bwaitfordeath:讓使用者指定他是否需要等待新執行緒死亡,並新增了與之相關的建構函式。clthread.h
"#include "
clexecutivefunctionprovider.h
"#include "
clevent.h
"#include "
cllog.h
"clthread::clthread(clexecutivefunctionprovider *pexecutivefunctionprovider) : clexecutive(pexecutivefunctionprovider)
clthread::clthread(clexecutivefunctionprovider *pexecutivefunctionprovider, bool bwaitfordeath) : clexecutive(pexecutivefunctionprovider)
clthread::~clthread()
clstatus clthread::run(void *pcontext)
m_flag = true;
if(!m_bwaitfordeath)
clstatus s = m_eventforwaitingfornewthread.wait();
if(!s.issuccess())
clstatus s1 = m_eventforwaitingforoldthread.set();
if(!s1.issuccess())
return clstatus(0, 0);
}void* clthread::startfunctionofthread(void *pthis)
clstatus s1 = pthreadthis->m_eventforwaitingforoldthread.wait();
if(!s1.issuccess())
pthreadthis->m_pexecutivefunctionprovider->runexecutivefunction(pcontext);
if(!(pthreadthis->m_bwaitfordeath))
delete pthreadthis;
return0;}
clstatus clthread::waitfordeath()
delete this;
return clstatus(0, 0);
}
m_flag:防止使用者在乙個clthread物件上多次呼叫run(),防止在沒有run()的情況下就waitfordeath()
m_eventforwaitingfornewthread和
m_eventforwaitingforoldthread
:用於同步主線程和子執行緒,保證:1.「
在run方法退出之前,新執行緒不會死亡
」,2.「
run方法返回前,應保證新執行緒確實已經被建立
」。用於避免由於在新執行緒先退出再waitfordeath()而引發異常。
在run()中,當新執行緒建立後,把
m_flag
置為true;
"。然後,呼叫clevent型別的m_eventforwaitingfornewthread的wait()來等待新執行緒建立完成;在退出前,m_eventforwaitingforoldthread
.set()告訴新執行緒可以繼續執行,執行具體的業務邏輯。退出後,即可呼叫waitfordeath()等待新執行緒結束。
一單子執行緒執行到startfunctionofthread(),就意味著新執行緒的建立已經完成,此時,m_eventforwaitingfornewthread
.set()告訴主線程的run()函式可以繼續,自己則在m_eventforwaitingforoldthread上等待run()發出的退出訊號。
執行完具體業務邏輯後,子執行緒返回到startfunctionofthread()中,在退出前,如果使用者選擇子執行緒自行結束,則這是子執行緒最後釋放資源的機會:delete pthreadthis釋放自己所占有的資源。
在waitfordeath
()中,若使用者沒有選擇
m_bwaitfordeath或新執行緒尚未建立,直接退出;退出前,同startfunctionofthread()一樣,釋放自身資源。
Linux之執行緒學習筆記
在linuxc中,建立程序fork 建立執行緒pthread creat 使用者在建立程序時,系統要為其分配記憶體空間 段,堆,棧等 建立執行緒不開闢記憶體空間,執行緒是程序中的一條執行路徑,執行緒之間共享程序的記憶體。執行緒是作業系統能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運...
linux下的c 多執行緒封裝
最近為了學習linux 下的多執行緒,自己用c 封裝了乙個簡易的區域網多執行緒聊天伺服器,期間遇到了一些坑寫到這裡與大家共勉!主要功能 封裝了乙個名叫pthread serv的類對每乙個客戶端的響應建立乙個程序進行資訊 遇到的問題 在使用linux提供的執行緒建立函式 int pthread cre...
linux 執行緒學習之條件變數
下面是乙個簡單的例子,我們可以從程式的執行來了解條件變數的作用。include include include pthread mutex t mutex pthread mutex initializer 初始化互斥鎖 pthread cond t cond pthread cond initia...