Man*_*iAm 3 c++ multithreading c++11
我在 C++11 代码中运行多个线程,并且线程体是使用 lambda 函数定义的,如下所示。
// make connection to each device in a separate child thread
std::vector<std::thread> workers;
for(int ii = 0; ii < numDev; ii++)
{
workers.push_back(std::thread([=]() { // pass by value
// thread body
}));
}
// detach from all threads
std::for_each(workers.begin(), workers.end(), [](std::thread &t) {
t.detach();
});
// killing one of the threads here?
Run Code Online (Sandbox Code Playgroud)
我与所有子线程分离,但在工人向量中保留每个子线程的引用。如何稍后在代码中杀死其中一个线程?
这里的帖子建议使用std::terminate(),但我想它对我来说没有用。
首先,不要使用 raw std::thread。它们很少是一个好主意。这就像手动调用newand delete,或者弄乱 io 代码中的原始缓冲区和长度计数器 - 等待发生的错误。
其次,不要杀死线程,而是为线程任务提供一个函数或原子变量来指示工作线程何时应该杀死自己。
工人会定期检查其“我应该死吗”状态,如果是的话,它会清理自己并死亡。
然后简单地向工人发出死亡信号,并等待它死亡。
这确实需要工作线程中的工作,如果它执行一些无法中断且持续很长时间的任务,那么它就不起作用。不要做不能中断且持续时间较长的任务。
如果你必须执行此类任务,请在不同的流程中执行,并来回整理结果。但现代操作系统倾向于使用异步 API,而不是用于 IO 任务的同步 API,如果您小心的话,这些任务可能会被中止。
当线程处于任意状态时终止该线程会将您的程序置于未知且未定义的执行状态。例如,它可能持有一个互斥体并且永远不会在标准库调用中释放它。但实际上,它可以做任何事情。
一般来说,分离线程也是一个坏主意,因为除非你神奇地知道它们已经完成(很困难,因为你分离了它们),否则在主要结束之后发生的事情是实现定义的。
跟踪您的线程,就像跟踪您的内存分配一样,但更重要的是。使用消息告诉线程自行终止。连接线程以清理其资源,可能在包装器中使用条件变量来确保您不会在线程基本完成之前加入。考虑使用std::async而不是原始线程,并将std::async其自身包装在进一步的抽象中。
| 归档时间: |
|
| 查看次数: |
3365 次 |
| 最近记录: |