Juk*_*rpa 8 c++ multithreading
我目前正在开发一个基本的线程池.我使用了c ++ 11 std::thread,以及std::condition_variable和std::unique_lock.它似乎工作,我现在希望能够杀死一些线程,当太多的线程不活动时.现在,他们的工作是通过给定std::queue的boost::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即将完成其执行,并让主线程稍后与此实例连接.