优雅地停止std :: thread?

sho*_*osh 9 c++ multithreading

我有一个工作者std::thread,我希望它的主循环检查是否有其他线程告诉它停止循环并退出.
什么是一个很好的跨平台方式来做到这一点?boost是否为它提供了一些事件对象?
使用只是一个bool考虑线程安全?

Mar*_*mes 7

.. 这得看情况.线程在做什么?它是否会阻止任何内容,I/O sleep或其他API?

如果它只是CPU循环,并且无论它何时停止停止并退出都无关紧要,那么只需使用布尔值即可.在这种情况下,锁定'stopAndExit'布尔值是没有意义的.

如果工作线程在一个循环中没有将它读为真,那么也许它应该是,因为一些缺乏原子性,它将在下一轮获得它.为什么在不需要时执行锁定/ API调用?与简单的"if(停止)退出;"相比,用户获取/释放同步对象的内核级别调用将花费很长时间,在每个可能用于计算的循环上浪费时间,或者无论您在CPU中执行什么操作 - 绑定线程.

它是跨平台的

此致,马丁

  • 我不知道如何保证这一点.如果没有内存屏障或易失性读取语义,那么编译器是否有效优化缓存寄存器中变量的值?在这种情况下,它永远不会看到更新.我可以告诉你,这种类型的问题**绝对存在于.NET中(如果多线程程序不断检查bool条件,它可能会进入无限循环,即使它实际上是现在的值!是的,因为它是从另一个线程更新的. (9认同)
  • +1用于让人们一直认为昂贵的同步方法是否真的是必要的. (3认同)