关于了解C++线程"detach()"的问题
Qestion about understanding "detach()" on threads in C++
我总是在互联网上看到规则:
如果不分离\加入线程,则将调用abort。
我需要一个中止发生的原因。
我可以理解join——因为当不对某个线程执行join时,main可能会在线程之前关闭,这可能会产生问题。
但是分离没有任何作用!它没有任何目的(至少从我在运行线程时看到的情况来看,无论是否分离)。
究竟是什么让中止跳转,任何分离的目的究竟是什么?
以下是导致"中止"的一个简单示例:
#include <iostream> // std::cout
#include <thread> // std::thread, std::this_thread::sleep_for
#include <chrono> // std::chrono::seconds
void pause_thread(int n)
{
std::this_thread::sleep_for (std::chrono::seconds(n));
std::cout << "pause of " << n << " seconds endedn";
}
int main()
{
std::cout << "Spawning and detaching 3 threads...n";
std::thread (pause_thread,1);
std::cout << "Done spawning threads.n";
// give the detached threads time to finish (but not guaranteed!):
pause_thread(5);
return 0;
}
线程与进程是不同的野兽。线程在父/子关系中根本不是。
C++11线程实现必须与所有主要的操作系统线程兼容,因此它必须做出设计决策,而这在第一眼就无法理解。
我将描述pthread,它在linux世界中使用。
创建线程时,可以指定其分离状态。它可以是两个值:
- DETACHED:当线程退出时,其分配的资源会自动释放。线程无法连接
- JOINABLE:当线程退出时,它的一些资源不会自动释放。例如,它的返回代码(在pthread中,有一个线程的返回值)。线程可以连接。资源将在
join()
处释放
C++线程被创建为JOINABLE,但您可以稍后分离它。
现在,如果在~thread()
不分离/连接线程,那么线程实现可以做什么?这是一个问题,因为如果它什么都不做,那么一些资源将被悄悄地泄漏(作为一个JOINABLE线程,当退出时,它的一些资源不会自动释放)
- 自动调用
join()
:这不是一个好主意,因为程序可能会在上面停滞(如果线程仍在运行)。这可能是一个编程错误 - 自动调用
detach()
:这也不是一个好主意,因为它可能是一个编程错误(线程继续运行,但其thread
对象已损坏-在这种情况下,程序员应该显式调用detach()
) - 调用
abort()
:这是实现所能做的最好的事情,以避免编程错误
因此std::thread
的设计者选择调用abort()
以避免编程错误。
(在windows上,线程系统是类似的。你必须为一个线程调用CloseHandle
,这样它的资源才能被释放)
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 关于了解C++线程"detach()"的问题