【问题标题】:Is this a case for a mutex?这是互斥锁的情况吗?
【发布时间】:2015-03-10 14:36:26
【问题描述】:

我有一个从设备捕获数据的线程。我从 gui 启动/停止线程。目前,线程会定期检查 appcontext 中的 bool 成员 isCapturingEnabled。我从 gui 切换此 bool 成员以停止线程。

这是我应该使用互斥锁的情况吗?因为捕获线程和主线程可能会同时尝试写入和读取bool

【问题讨论】:

  • periodically checks a bool 为什么不是条件变量,它是为这些场景制作的?如果它是一个线程,为什么要打扰或者你没有透露所有内容?
  • 从您的描述看来,GUI 是唯一写入布尔值的线程。不是这样吗?
  • @mstbaum 实际上,捕获线程也会在异常情况下写入,线程停止并将 bool 设置为 false
  • @DumbCoder 一个条件变量适合等待,什么都不做,直到条件变为真——这对于请求工作线程终止来说是一个糟糕的用例——它更适合相反的用途案例 - 等待工人完成。
  • 为了简单起见,std::atomic<bool> 怎么样? stackoverflow.com/questions/16111663/…

标签: c++ mutex boost-mutex


【解决方案1】:

您将遇到的问题是,如果没有某种锁定或内存屏障,则可能(例如)gui 线程可能会将 bool 设置为 true,但由于编译器,线程实际上不会看到这一点CPU 级别的优化或优化。

您需要做的是写入bool,以便从内存中加载当前状态,并正确写回新状态,以便所有线程都能看到更改。正如您所确定的,一种方法是使用互斥锁。其他方法是使用memory barriers 来确保您访问的是正确的内存视图。大多数语言或操作系统通常都有某种 API,用于以原子方式将内存操作到一个单词的大小。例如,在 Windows 上,有 InterlockedCompareExchange 函数。

但是,在 95% 的情况下,从性能角度来看,仅将读/写封装在互斥体中就足够了,并且在多线程正确性方面很容易推理。

【讨论】:

    猜你喜欢
    • 2015-10-11
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多