【问题标题】:Whats the proper way to flag a thread to exit using boost without c++11什么是在没有 c++11 的情况下使用 boost 标记线程退出的正确方法
【发布时间】:2012-02-08 11:31:09
【问题描述】:

在阅读了关于如何不应该使用 volatile 来标记正在运行的线程退出的各种答案(以及使用 boost:atomic<> 的建议)之后,我仍然找不到关于如何在没有 C++ 的情况下使用 boost 正确执行此操作的答案11.

  1. 我应该使用boost::mutex吗?
  2. 如果是这样,我是否需要锁定我的 m_stopThread 变量并将其更改为 true 并在我的运行循环中进行检查?
  3. boost::mutex 锁定调用是要调用操作系统还是仅使用内存屏障指令等更轻松?

【问题讨论】:

  • interrupt 有什么问题?
  • 互斥锁实现有所不同,但例如Linux 有futex ("Fast Userspace muTEX"),它旨在避免系统调用,除非锁被实际争用。 AFAIK 所有 Linux 同步原语都尽可能使用它,因此 Linux 上的 boost::mutex 应该具有相同的属性。出于同样的原因,Windows 上的boost::mutex 可能会尽可能使用CriticalSection,但您必须检查一下。
  • 哦,当锁被争用时系统调用“无关紧要”,因为在获取锁时,您将进入睡眠状态或以其他方式闲置,因此您“负担得起”它们。释放锁时,好的,当您必须进行系统调用以唤醒其他人时,确实会花费一些时间。但在实践中,大多数锁不会经历很多争用,因此除非在激进的实时环境中,否则偶尔的性能损失并不重要。
  • 从实用的角度来看,简单的 volatile 标志可以正常工作。从理论上看为什么不使用c++11?
  • @user396672:问题(可能取决于您的实际代码)是编译器可以重新排序对非易失性变量的访问。如果两个线程之间的唯一交互是布尔标志,那么缺乏更严格的保证可能无关紧要,但如果有任何其他数据交换(考虑更新发布者中的值并通过 volatile 标志通知消费者) 未指定关于通知的发布顺序。

标签: c++ multithreading boost mutex


【解决方案1】:

我想只需要在设置和读取内存屏障之后调用一些东西来发出写mamory屏障,然后再测试。它可能是原子操作、互斥访问或其他任何东西。 (我想即使输入不同的互斥锁也可以:) 如果你不着急,你可能什么也不做,因为正确的屏障指令应该在将来的某个时候发出(至少在发生硬件中断时)。 当然,m_stopThread 应该声明为 volatile

(虽然从标准的角度来看我可能是错的)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-26
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    相关资源
    最近更新 更多