无法杀死std :: thread

时间:2017-11-28 15:55:07

标签: c++ multithreading

我有一个程序,我需要运行一个线程。问题是每当我尝试从线程内部或线程外部杀死此线程时我得到一个"错误6 - 无效句柄"错误

class myclass
{
public:
    static myclass* inst()
    {
        if (oInst == nullptr) oInst = new myclass;
        return oInst;
    };
    void main();

    void start();


    void ex_stop()
    {
        //HANDLE Stopper = Killer.native_handle();
        //TerminateThread(Stopper, 0);
    }
}
private:
    std::thread Killer;

}

void myclass::start()
{
    Killer = std::thread(&myclass::ex_main, this);
    Killer.detach();
}

void myclass::main()
{
    ...
    if (0 == TerminateThread(Killer.native_handle(), 0))
    {
            char error[200];


            sprintf(error, "error %i\n", GetLastError());

            printf(error);
    }

这就是我启动类/线程的方法

    myclass::inst()->start();

我也试过让std :: thread Killer成为extern并在我的.cpp和.h文件中声明它,这样我可以从课外访问它,但我仍然得到同样的#34 ;错误6,无效的线程句柄"错误。

有人可以告诉我这段代码有什么问题吗?感谢

1 个答案:

答案 0 :(得分:1)

设置工作线程的常用方法是将其置于一个循环中,并在每个循环上检查一个布尔原子是否已被更改......看起来像是什么(但这可能不是&#39 ; t直接编译; threadMain可能需要绑定)

class myThreadJob {
  public:

  myThreadJob(): 
    doRun(true),
    thread(threadMain)
  {}

  void threadMain() {
      while (doRun) {...}
  }

  void stop() {
      doRun = false;
      thread.join();
  }

  private:
  std::atomic<bool> doRun;
  std::thread thread;
}

你还没有说过,你的线程是否会在队列中执行许多任务,或者它是否是一个他们正在做的工作,但无论如何,如果它是预计它将是一个长期存在的线程,它应该定期检查它是否仍然可以运行。

因为您已经在线程上调用了detach(),所以您的线程不再与您的进程相关联。您可以将detach()视为一个声明,该线程不需要创建线程本地的任何内容。 你不被允许加入;并且你期望它能够终止。