如何销毁由std :: thread显式创建的线程?

Shi*_*nha 1 c++ windows multithreading

我希望两个线程最初都在无限循环中运行,但是有一段时间后我想杀掉第一个线程而不等待它完成,第二个线程应该正常运行.我该如何实现它?当我运行以下代码时,它会给出调试错误!

void f1(int i)
{
    while (1)
     {
             printf("Executng Thread  %d : %d\n", i, j);
            Sleep(10);
    }

}


int main()
{   
    std::thread t1(f1, 1);  
    std::thread t2(f1, 2);

    Sleep(100);
     t1.~thread();  
    while (1)
    {

        Sleep(10);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 7

程序在设定的控制流之后执行确定的指令集.您不能随意中断此控制流程,仍然可以解释您的程序行为.

就像你不能说"运行我的程序,但不超过10秒"没有程序知道这一点并产生有意义的输出,你不能在没有线程知道它并产生有意义的程序状态的情况下杀死一个线程.简而言之,"线程取消需要合作".

这是让线程合作的简单方法:使用共享标志.

#include <atomic>
#include <chrono>
#include <thread>

std::atomic<bool> thread_1_must_end(false);

void foo(int thread_id)
{
    while (true)
    {
        if (thread_id == 1 && thread_1_must_end.load()) { break; }
        // do stuff
    }
}

int main()
{
    using std::literals::chrono_literals;

    std::thread t1(foo, 1), t2(foo, 2);
    std::this_thread::sleep_for(500ms);

    thread_1_must_end.store(true);
    t1.join();  // 1

    // ...

}
Run Code Online (Sandbox Code Playgroud)

请注意,此过程仍然是合作的.的join()操作(标记// 1)的块,直到该线程功能环围绕并检查该标志.没有时间保证.如果线程函数忽略该标志,则无法与之通信.这是你的责任,让所有的线程函数足够的设施来学习的时候,是时候结束.