获取一个std :: thread来分离并终止自身

Juk*_*rpa 8 c++ multithreading

我目前正在开发一个基本的线程池.我使用了c ++ 11 std::thread,以及std::condition_variablestd::unique_lock.它似乎工作,我现在希望能够杀死一些线程,当太多的线程不活动时.现在,他们的工作是通过给定std::queueboost::function秒.我想添加一堆空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();
    }
  // ??
}
Run Code Online (Sandbox Code Playgroud)

问题是,一旦我退出循环,我不确定如何正确分离线程.寻找线程的句柄是否干净(我可以访问a std::list<std::thread*>,并且可以比较它们的ID std::this_thread::get_id()),detach()从线程本身调用是否安全,甚至join()

Ale*_*nov 11

是的,如果你有存储的所有线程对象,你可以找到一个这thread::id等于this_thread::get_id(),你可以调用detach()它,之后销毁线程对象(C++ 11标准并没有阻止,我相信它是基于通常的做法).确保没有其他执行线程访问其实例std::thread被销毁.

但你无法join()从线程本身调用:尝试线程与自身连接会导致死锁,而C++ 11实现应该识别并抛出system_error错误条件resource_deadlock_would_occur.

或者,您可以将消息(例如,通过std :: atomic变量)留给主线程,该线程与特定实例关联的线程std::thread即将完成其执行,并让主线程稍后与此实例连接.