我总是在网上看到规则:
如果你没有分离\加入一个线程,那么将调用abort。
我需要一个理由说明为什么会中止。
我可以通过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 ended\n";
}
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;
}
答案 0 :(得分:0)
线程是与进程不同的野兽。线索在父/子关系中不。
C ++ 11线程实现必须与所有主要的OS线程兼容,因此它必须做出设计决策,而这些决定一见不到。
我将描述在Linux世界中使用的pthread。
创建线程时,可以指定其detachstate。它可以是两个值:
join()
。C ++线程被创建为JOINABLE,但您可以稍后将其分离。
现在,如果你没有分离/加入一个线程,在~thread()
,线程实现可以做什么?这是一个问题,因为如果它没有做任何事情,那么一些资源将被静默泄露(当退出时作为一个JOINABLE线程,它的一些资源不会自动释放)
join()
:不是一个好主意,因为程序可以停止它(如果线程仍在运行)。这可能是编程错误。detach()
:也不是一个好主意,因为它可能是编程错误(线程继续运行,但其thread
对象被销毁 - 程序员在这种情况下应该明确地调用detach()
abort()
:这是实现可以做的最好的,以避免编程错误因此std::thread
的设计人员选择调用abort()
以避免编程错误。
(在Windows上,线程系统类似。你必须为一个线程调用CloseHandle
,以便可以释放它的资源)