Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有可能杀死一根纺线吗?_C++_Multithreading - Fatal编程技术网

C++ 有可能杀死一根纺线吗?

C++ 有可能杀死一根纺线吗?,c++,multithreading,C++,Multithreading,我使用ZTrp来说明这个问题,但是我的问题适用于pCuth+Boost线程和C++中的其他线程库。 class MyClass: public Runnable { public: void run() { while(1) { } } } 我现在宣布如下: MyClass *myClass = new MyClass(); Thread t1(myClass); 现在是否可以(必要时使用暴力)杀死此线程?我可以肯定地做到这一点,而不是

我使用ZTrp来说明这个问题,但是我的问题适用于pCuth+Boost线程和C++中的其他线程库。
class MyClass: public Runnable
{
 public:
  void run()
   {
      while(1)
      {

      }
   }
}
我现在宣布如下:

MyClass *myClass = new MyClass();
Thread t1(myClass);

现在是否可以(必要时使用暴力)杀死此线程?我可以肯定地做到这一点,而不是无限循环,我有一个
Thread::Sleep(100000)
,也就是说,如果它是阻塞的。但是我可以杀死一个旋转的线程(做计算)。如果是,如何进行?如果没有,为什么不呢?

您可以使用TerminateThread()API,但不推荐使用

详情请浏览:

可以强制终止线程,但执行此操作的调用将是特定于平台的。例如,在Windows下,您可以使用该函数执行此操作

请记住,如果使用TerminateThread,在程序终止之前,线程将没有机会释放它正在使用的任何资源。

就Windows而言(从):

TerminateThread是一个危险的函数,只能在 最极端的情况。如果需要,则应调用TerminateThread 确切地知道目标线程正在做什么,您就可以控制所有的线程 目标线程当时可能正在运行的代码 终止的原因。例如,TerminateThread会导致 以下问题:

If the target thread owns a critical section, the critical section will not be released.
If the target thread is allocating memory from the heap, the heap lock will not be released.
If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread's process could be inconsistent.
If the target thread is manipulating the global state of a shared DLL, the state of the DLL could be destroyed, affecting other users of the DLL.

Boost当然没有线程终止功能。

正如人们所说,没有可移植的方法终止线程,在某些情况下根本不可能。如果您可以控制代码(即可以修改代码),最简单的方法之一是让线程定期检查布尔变量,如果设置了布尔变量,则尽快终止线程。

您不能添加如下内容吗

do {

  //stuff here

} while (!abort)

如果在长度上小于(例如在上面的循环中)或中间,如果计算时间过长,则在计算之间偶尔检查标志,如果计算时间长,则中止计算;

>P>,在萨特草稿中可以找到一个问题的一般解决方案:

这允许您拥有类似的内容(摘自文章):


此解决方案促进了一个干净的线程函数的存在,并且避免了与一个不干净线程终止相关的所有其他问题。

< P>如果您需要杀死一个线程,请考虑使用一个进程来代替。 特别是如果您告诉我们您的“线程”是一个while(true)循环,它可能会长时间休眠,执行一些必然阻塞的操作。对我来说,这表明了一种类似过程的行为

进程几乎可以在任何时候以多种方式终止,并且总是以干净的方式终止。它们还可以在发生碰撞时提供更高的可靠性

现代操作系统提供了一系列进程间通信设施:套接字、管道、共享内存、内存映射文件。。。他们甚至可以交换文件描述符

好的操作系统具有写时拷贝机制,因此进程分叉成本很低


请注意,如果您的操作可以以非阻塞方式进行,那么您应该使用类似轮询的机制。asio可能会有所帮助。

不确定其他库,但在pthread库中,pthread_kill函数可用

keepAlive
变量定义为
int
。 最初设置
keepAlive=1
的值

class MyClass: public Runnable
{
 public:
  void run()
   {
      while(keepAlive)
      {

      }
   }
}
现在,当您每次想要终止线程时,只需设置
keepAlive=0
的值

Q。这是怎么回事


A。线程将处于活动状态,直到函数继续执行。因此,终止函数非常简单。将变量的值设置为
0
&它会中断,从而导致线程终止。[
这是迄今为止我发现的最安全的方法。

只有在运行时环境中,您可以可靠地遍历堆栈,才能安全地杀死线程。因此,您可以看出线程没有执行一个关键的内核函数,该函数一旦中止,将使进程处于不稳定状态。例如,持有堆锁。C++没有提供这样的运行环境。@ Hans Passant Can,你精心准备并发布答案?从系统的角度来看,这是一种通用的(不是特定于平台/框架的)答案……你怎么知道他在运行Windows?sstn,你怎么知道他不运行?只要访问bool变量是无种族歧视的,你就可以这样做。这假设您在锁下修改标志,或使用其他无锁机制确保标志不引入竞争条件。@Ghita“不引入竞争条件”我想您的意思是“数据竞争”,而不是“竞争条件”。这种竞争是内在的。@curiousguy术语:-)是的,你是对的,这是一种数据竞争。我认为没有任何可移植的方法可以在不产生负面后果的情况下杀死正在执行的线程。Boost引入了线程中断函数,它会在出现异常的情况下展开堆栈。当然,它需要将中断点注入到线程主循环中。
~Active() {
    Send( [&]{ done = true; } ); ;
    thd->join();
  }
class MyClass: public Runnable
{
 public:
  void run()
   {
      while(keepAlive)
      {

      }
   }
}