![](/img/trans.png)
[英]Preventing thread from calling std::terminate() on detach after handled exception
[英]Get a std::thread to detach and terminate itself
我目前正在開發一個基本的線程池。 我使用了c ++ 11的std::thread
,以及std::condition_variable
和std::unique_lock
。 它似乎工作,我現在希望能夠殺死一些線程,當太多的線程不活動時。 目前,他們的工作是通過boost::function
s的std::queue
給出的。 我想添加一堆空的boost::function
所以線程知道他們必須退出循環。 線程的循環是這樣的:
void ThreadPool::threadLoop()
{
boost::function<void ()> oThreadTask;
std::unique_lock<std::mutex> oLock(m_oTaskMutex);
while (1)
{
// m_oCV is a static std::condition_variable
// m_oTaskQueue is a static std::queue< boost::function<void ()> >
m_oCV.wait(oLock, [](){ return m_oTaskQueue.size(); });
oThreadTask = m_oTaskQueue.front();
m_oTaskQueue.pop();
m_oTaskMutex.unlock();
if (oThreadTask.empty())
break ;
oThreadTask();
}
// ??
}
問題是,一旦我退出循環,我不確定如何正確分離線程。 查找線程的句柄是否干凈(我可以訪問std::list<std::thread*>
,並且可以將它們的id與std::this_thread::get_id()
),是否安全從線程本身調用detach()
,甚至是join()
?
是的,如果存儲了所有線程對象,你可以找到thread::id
等於this_thread::get_id()
,你可以在其上調用detach()
,然后銷毀線程對象(C ++ 11標准並沒有阻止這一點,我相信它是基於常見的做法)。 確保沒有其他執行線程訪問被銷毀的std::thread
實例。
但是你不能從線程本身調用join()
:線程與自身連接的嘗試會導致死鎖,並且C ++ 11實現應該識別並且使用resource_deadlock_would_occur
的錯誤條件拋出system_error
。
或者,您可以將消息(例如,通過std :: atomic變量)留給主線程,該線程與std::thread
的特定實例關聯的std::thread
即將完成其執行,並讓主線程與此實例連接稍后。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.