Linux學習之 執行緒的再封裝

2022-08-28 18:09:11 字數 2766 閱讀 9405

先上**,主要是執行緒類"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 "

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_bwaitfordeath:讓使用者指定他是否需要等待新執行緒死亡,並新增了與之相關的建構函式。

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...