首页 > 解决方案 > 在不锁定 Mutex 的情况下读取受 Mutex 保护的共享数据

问题描述

给定受 Mutex 保护的共享数据。在不需要锁定互斥锁的情况下读取部分共享数据的适当方法是什么?如下例所示,使用 std::atomic_ref 是否合适?

struct A
{
  std::mutex mutex;
  int counter = 0;
  void modify()
  {
    std::lock_guard<std::mutex> guard(mutex);
    // do something with counter
  }
  int getCounter()
  {
    return std::atomic_ref<int>(counter).load();
  }
};

标签: c++thread-safetylockingmutexatomic

解决方案


如果您绕过锁定互斥锁并从共享数据执行原子读取(例如使用),那么如果其他线程之一使用非原子访问写入std::atomic_ref,您的程序将调用未定义的行为。

如果所有线程都使用原子操作来访问共享数据,那么就没有未定义的行为。但是,在这种情况下,如果所有访问都是原子的,那么使用互斥锁保护共享数据可能没有意义。


推荐阅读