c++ - 在不锁定 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
,您的程序将调用未定义的行为。
如果所有线程都使用原子操作来访问共享数据,那么就没有未定义的行为。但是,在这种情况下,如果所有访问都是原子的,那么使用互斥锁保护共享数据可能没有意义。
推荐阅读
- regex - 验证特定标识符模式
- sql - 如何在 SQL 中获取日期差异?
- javascript - 从 JS(浏览器)创建和下载一个 UTF8 纯文本文件
- azure-data-factory - 如何将CSV复制到ADF中具有带点的列标题的Json?
- sql - SQL BigQuery - 在“IN”子句中使用 WITH 视图
- php - 将 2 个表中的 2 个不同 id 保存到另一个表中
- git - 将 git 浅克隆转换为部分克隆
- substrate - 错误:特征绑定 `types::DepartmentDetails: scale_info::TypeInfo` 不满足
- python - 为什么我的神经网络的准确率没有提高?
- javascript - JQuery - 删除字符后的文本,保持字符串逗号分隔