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

时间:2015-01-12 09:23:16

标签: 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;
}

1 个答案:

答案 0 :(得分: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

    // ...

}

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