簡體   English   中英

獲取一個std :: thread來分離並終止自身

[英]Get a std::thread to detach and terminate itself

我目前正在開發一個基本的線程池。 我使用了c ++ 11的std::thread ,以及std::condition_variablestd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM