作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这可能是个愚蠢的问题,但请考虑以下伪代码:
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/
我是一名优秀的程序员,十分优秀!