我有一个程序,我需要运行一个线程。问题是每当我尝试从线程内部或线程外部杀死此线程时我得到一个"错误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,无效的线程句柄"错误。
有人可以告诉我这段代码有什么问题吗?感谢
答案 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()视为一个声明,该线程不需要创建线程本地的任何内容。 你不被允许加入;并且你期望它能够终止。