如何在C ++ 11中终止一个线程?

我不需要正确地终止线程,或者使其响应“终止”命令。 我有兴趣使用纯C ++ 11强制终止线程。

  1. 你可以从任何线程调用std::terminate() ,你所指的线程将强制结束。

  2. 您可以安排~thread()在目标线程的对象上执行,而不在该对象上插入join()detach() 。 这将与选项1具有相同的效果。

  3. 你可以devise一个具有抛出exception的析构函数的exception。 然后安排目标线程在强制终止时抛出这个exception。 这一个棘手的部分是让目标线程抛出这个exception。

选项1和2不会泄漏进程内资源,但会终止每个线程。

选项3可能会泄漏资源,但部分合作,目标线程必须同意抛出exception。

在C ++ 11(我知道)中没有可移植的方式来非协作地杀死multithreading程序中的单个线程(即不杀死所有线程)。 没有动机来devise这样的function。

一个std::thread可能有这个成员函数:

 native_handle_type native_handle(); 

你也许可以用它来调用一个依赖于操作系统的函数来做你想做的事情。 例如,在Apple的操作系统上,该函数存在, native_handle_typepthread_t 。 如果你成功了,你很可能会泄漏资源。

霍南德的回答是正确全面的。 但是如果它被读得太快,可能会被误解,因为std::terminate() (整个进程)恰好与@AlexanderVX想到的(1个线程)具有相同的名字。

总结:“终止1线程+强制(目标线程不合作)+纯C ++ 11 =没有办法。

这个问题实际上具有更深层次的性质,对multithreading概念的一般理解将为您提供有关该主题的信息。 事实上,没有任何语言或任何操作系统为您提供asynchronous突发线程终止的function,而不会警告不使用它们。 所有这些执行环境强烈build议开发人员甚至需要在合作或同步线程终止的基础上构buildmultithreading应用程序。 这个共同的决定和build议的原因是它们都build立在相同的通用multithreading模型的基础上。

让我们比较多处理和multithreading概念,以更好地理解第二个优点和局限性。

多处理假定将整个执行环境分解为由操作系统控制的一组完全隔离的进程。 进程并入和隔离执行环境状态,包括进程的本地内存和其中的数据以及所有系统资源,如文件,套接字,同步对象。 隔离是该过程的一个非常重要的特征,因为它限制了过程边界的错误传播。 换句话说,任何一个进程都不能影响系统中其他进程的一致性。 对于过程行为也是如此,但是以更less的限制和更模糊的方式。 在这样的环境中,任何进程都可以在任意“任意”的时刻被杀死,因为每一个进程都是孤立的,其次是操作系统对进程使用的所有资源都有充分的了解,并且可以释放所有资源而不会泄漏,最终进程被终止通过操作系统不是真的在任意时刻,但在过程的状态是众所周知的明确点的数量。

相反,multithreading则假设在同一个进程中运行多个线程。 但是,所有这些线程共享相同的隔离框,并且没有任何操作系统控制进程的内部状态。 因此,任何线程都能够改变全局进程状态,并破坏它。 同时,线程状态众所周知的安全杀死一个线程的点完全取决于应用程序的逻辑,既不知道操作系统也不知道编程语言运行时。 因此,在任意时刻线程终止意味着在其执行path的任意点将其杀死,并且可能容易导致进程范围的数据损坏,内存和处理泄漏,线程泄漏和自旋锁以及其他进程内同步原语存在于closures状态阻止其他线程进行。

由于这个原因,通常的做法是强制开发人员实现同步或合作的线程终止,其中一个线程可以请求其他线程终止,而其他线程定义良好的点可以检查该请求,并从明确定义的状态启动closures过程以安全一致的方式释放全球全系统资源和地方全过程资源。