執行緒池
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...