在不锁定Mutex的情况下读取受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();
}
};

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

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

最新更新