我目前正在嘗試使用std::thread
來創建一個非常簡單的線程池。 爲了在完成給定的任務後保持線程'活着',我將它們中的每一個與std::mutex
聯繫起來。互斥鎖是否按照與它們相同的順序發生?
原理有點像這樣:
// Thread loop
while (1)
{
m_oMutex->lock();
m_oMutex->unlock();
m_bAvailable = false;
m_oTask();
m_bAvailable = true;
}
// ThreadPool function which gives a task to a thread
void runTask(boost::function<void()> oTask)
{
[...]
m_oThreads[i]->setTask(oTask);
m_oMutexes[i]->unlock(); // same mutex as thread's m_oMutex
m_oMutexes[i]->lock();
}
要與m_bAvailable
設置爲true
找到i
,則ThreadPool
搜索一個線程對象。它解鎖相應的互斥鎖,以便thread
可以鎖定它並執行其任務。 thread
會立即解鎖,因此ThreadPool
可以再次鎖定,因此一旦其任務完成,thread
就會暫停。
但問題是,會按線程詢問他們的順序鎖定嗎?換句話說,如果一個thread
對mutex
鎖定,然後ThreadPool
解鎖它並再次鎖定它,我確定首先鎖定將被給予thread
?如果沒有,是否有辦法確保它?
謝謝。 'condition_variable'似乎完美地完成了這個訣竅。有一個問題,我嘗試了http://en.cppreference.com/w/cpp/thread/condition_variable/wait的例子,我不明白爲什麼第一個線程用'cv_m創建'std :: unique_lock' '作爲參數被阻塞,因爲他是第一個鎖定互斥鎖的(在'unique_lock's構造函數中)。 – Jukurrpa 2012-01-28 16:59:36
在那個例子中,等待線程可能會獲得鎖,然後在等待信號的時候釋放它。這些線程以非確定性方式獲取鎖的順序,因爲它們是異步運行的。然後,由於多線程的性質,它們從「等待」調用中喚醒的順序也未定義。有一件事情是肯定的,那就是每個線程在運行「cerr <<」時都會通過互斥鎖對代碼進行獨佔鎖定。「......等待完成......」 – 2012-01-29 19:44:28