c 封裝執行緒池

2021-07-04 08:53:39 字數 1668 閱讀 4368

執行緒池

threadpool宣告

class thread;  

class threadpool final

;

說明幾點:

(1)thread使用前向宣告,減少標頭檔案的依賴;

(2)當任務佇列中任務為空時,執行緒池中的執行緒要等待任務產生,此時執行緒處於睡眠狀態,等待條件,應該使用條件變數;當計算任務被提交到任務佇列中,要使用條件變數傳送訊號,喚醒等待的執行緒;這裡使用此前部落格講述的condition和mutex來實現;

(3)執行緒向任務佇列中提交任務和獲取任務,需要使用互斥量保護任務佇列本身,這裡任務佇列使用stl中queue實現;對於執行緒池的實現,使用vector>來實現;

threadpool實現

threadpool::threadpool(size_t threadnums):  

_threadnums(threadnums),

_running(false),

_mutex(),

_cond(_mutex)

threadpool::~threadpool()

void threadpool::start()

} void threadpool::stop()

} void threadpool::submittask(const taskfunc& task)

_cond.wake();

}

threadpool::taskfunc threadpool::_taketask()

} mutexlockguard lock(_mutex);

taskfunc task;

if (!_tasksqueue.empty())

return task;

}

void threadpool::_runthread()

catch (...)

} }

說明幾點:

(1)存在threadpool物件已經析構,但是執行緒池中線程未終止,因此在thread析構函式中,首先要對當前狀態_running進行判斷,若仍為true,是要執行threadpool的stop函式的;

(2)在stop函式中,首先將_running置為false,然後通知所有執行緒喚醒,此時所有的執行緒執行完當前的任務後,都會退出_runthread()函式;在stop最後一部分,要join等待執行緒池中的各個執行緒,若不等待threadpool已經析構後,std::vector> _threadpool也將開始析構,造成thread析構,這樣此後執行緒執行任何與thread相關的操作都將會未定義;因此需要執行緒退出後,thread才開始析構,這樣thread的生命週期要長於執行緒的生命週期;

(3)在_taketask(),執行緒等待的條件是while ( _running && _tasksqueue.empty()),當_running為false時,說明此時執行緒池將要停止,因此執行緒要退出_runthread()函式,join才會返回,取到的task有可能為空的,在_runthread()中在執行task之前,還要判斷if (task)該任務是否為空,不為空才會執行任務;

執行緒池的簡介及執行緒池封裝

執行緒池 執行緒池就是首先建立一些執行緒,它們的集合稱為執行緒池。使用執行緒池可以很好地提高效能,執行緒池在系統啟動時即建立大量空閒的執行緒,程式將乙個任務傳給執行緒池,執行緒池就會啟動一條執行緒來執行這個任務,執行結束以後,該執行緒並不會死亡,而是再次返回執行緒池中成為空閒狀態,等待執行下乙個任務...

c 執行緒池 多執行緒

1。設定引數類 using system using system.collections.generic using system.text public class stateinfo 執行緒開啟方法類 using system using system.collections.generic ...

C 執行緒與執行緒池

include include include std uint32 t lwp id c 11提供了對執行緒技術的支援,include include include include include using namespace std struct result void f1 promise...