gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:02:25 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com