我是C ++ 11中线程的新手,我想知道如何管理工作线程(使用标准库)来执行某些任务然后死掉。我有一个线程池vector<thread *> thread_pool
,它维护一个活动线程列表。
我们假设我使用thread_pool.push_back(new thread(worker_task))
启动新线程并将其添加到池中,其中worker_task
的定义如下:
void worker_task()
{
this_thread::sleep_for(chrono::milliseconds(1000));
cout << "Hello, world!\n"
}
一旦工作线程终止,从池中可靠地删除线程的最佳方法是什么?主线程需要连续运行,并且无法阻止join
调用。我对代码的一般结构比同步的复杂性更加困惑。
编辑:看起来我在代码中滥用了池的概念。我的意思是我有一个当前正在运行的线程列表。
答案 0 :(得分:3)
您可以使用std::thread::detach来&#34;将执行线程与线程对象分开,从而允许执行独立继续。一旦线程退出,任何分配的资源都将被释放。&#34;
如果每个线程都应使其状态可见,则可以将此功能移动到线程函数中。
std::mutex mutex;
using strings = std::list<std::string>;
strings info;
strings::iterator insert(std::string value) {
std::unique_lock<std::mutex> lock{mutex};
return info.insert(info.end(), std::move(value));
}
auto erase(strings::iterator p) {
std::unique_lock<std::mutex> lock{mutex};
info.erase(p);
}
template <typename F>
void async(F f) {
std::thread{[f] {
auto p = insert("...");
try {
f();
} catch (...) {
erase(p);
throw;
}
erase(p);
}}.detach();
}