c++ - 非变异操作本质上是线程安全的(C++)吗?

标签 c++ multithreading thread-safety

这可能是个愚蠢的问题,但请考虑以下伪代码:

struct Person {
    std::string name;
};

class Registry {
public:
  const std::string& name(int id) const {return _people[id].name;}
  void name(int id, const std::string& name) { [[scoped mutex]]; _people[id].name = name;}

private:
  std::map<int, Person> _people;
};

在这个简单的例子中,假设 Registry 是一个将被多个线程访问的单例。我在改变数据的操作期间锁定,但在非改变访问期间不锁定。

这个线程安全吗,还是我应该在读操作期间也加锁?我正在阻止多个线程同时尝试修改数据,但我不知道如果一个线程试图同时读取另一个线程正在写入会发生什么情况。

最佳答案

如果任何线程都可以修改数据,那么您需要为所有 访问锁定。

否则,当数据处于不确定状态 时,您的“读取”线程之一可能会访问数据。例如,修改 map 需要操作多个指针。您的阅读线程可以访问 map ,而部分(但不是全部)map 已调整。

如果您可以保证数据未被修改,则不需要锁定来自多个线程的多次读取,但是这会引入一个您必须密切关注的脆弱场景。

关于c++ - 非变异操作本质上是线程安全的(C++)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15551374/

相关文章:

python - 如何在 Python 中验证我的线程安全模型?

java - 最终不可修改的集合线程安全吗?

c++ - 如何使用 C++ 函数指针作为 C 函数指针/回调的参数

java - 在android中每2小时调用一次方法的最佳方法?

java - 使用多线程代码防止DOS攻击

java - JVM 或底层操作系统是否处理线程状态更改

java - Java中对 volatile 对象进行非 volatile 引用的行为

c++ - C++中的url响应时间跟踪器

c++ - C++中的开源随机数生成算法?

c++ - Rcpp:构建共享库时出错