如何在c ++中终止或停止分离的线程?

cod*_*ark 12 c++ multithreading thread-safety

我有兴趣在c ++中终止/停止/杀死分离的线程.如何才能做到这一点?

void myThread()
{
    int loop = 0;
    while(true)
    {
        std::this_thread::sleep_for(std::chrono::seconds(5));
        ++loop;
    }
}

void testThread()
{
    std::thread globalThread(myThread);
    globalThread.detach();
}

int main(void)
{
    testThread();
    for(unsigned int i=0; i < 1000; i++)
    {
        cout << "i = " << i << endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我之所以要"停止"/"终止"globalThread(),是因为valgrind列出了这种"可能丢失"的内存泄漏类型(152字节).处理这个问题的最佳方法是什么?

Sam*_*hik 10

没有规定可以阻止另一个线程; 它是分离的还是可加入的.

停止线程的唯一方法是让线程从初始线程函数返回.

在这种特殊情况下,我建议进行以下更改:

  1. 不要分离线程.在main()中实例化它.
  2. 添加bool值,然后std::mutex将bool初始化为false
  3. 每次通过线程的内部循环,使用a锁定互斥锁std::unique_lock,取bool的值,然后解锁互斥锁.解锁互斥锁之后,如果bool是true,则跳出循环,然后返回.
  4. 在main()中,退出之前:锁定互斥锁,设置bool标志true,解锁互斥锁,然后加入线程

这并不完美,因为第二个线程需要花费五秒钟来检查bool标志并返回.但是,这将是第一次.

  • 我认为`mutex`对于一个简单的旗帜来说太过分了.听起来更像是`atomic <bool>`或`atomic_flag`的工作. (12认同)
  • @WhozCraig,我通过注意到第1步加入它,"不要分离线程". (4认同)
  • @avakar,您加入了一个“独立”线程...如何?OP已经建立了线程分离;没有什么可以加入的。 (2认同)