假设我先启动一个 std::thread
,然后再启动一个 detach()
,这样即使曾经代表它的 std::thread
超出了作用域,线程也会继续执行。
进一步假设程序没有一个可靠的协议来连接分离的线程 1,因此当 main()
退出时,分离的线程仍然运行。
我在标准(更确切地说,在 N3797 C + + 14草案中)中找不到任何描述应该发生什么的内容,1.10和30.3都没有相关的措辞。
1 另一个可能等价的问题是: “一个分离的线程能否再次被连接”,因为无论你发明什么协议来连接,信令部分必须在线程仍在运行时完成,而操作系统调度程序可能决定在信令执行之后让线程休眠一个小时,而接收端无法可靠地检测到线程实际上已经完成。
如果在运行分离线程的情况下用完 main()
是未定义的行为,那么 任何使用 std::thread::detach()
就是未定义的行为,除非主线程从未退出 2。
因此,在运行分离线程时用完 main()
必须具有 定义效果。问题是: 哪里(在 C + + 标准中,不是 POSIX,不是 OS docs,...)是定义的那些效果。
2 不能连接分离的线程(std::thread::join()
意义上的)。可以等待来自分离线程的结果(例如通过 std::packaged_task
的将来,或者通过计数信号量、标志和条件变量) ,但是这并不能保证 线程已完成执行。实际上,除非你把信令部分放入线程的第一个自动对象的析构函数中,否则 威尔通常是运行 之后信令代码的代码(析构函数)。如果操作系统调度主线程使用结果并在分离的线程完成运行所述析构函数之前退出,那么 ^ Wis 将会发生什么?