这可能是一个愚蠢的问题,但请考虑以下伪代码:
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 是一个可以被多个线程访问的单例。我在改变数据的操作期间锁定,但在非改变访问期间没有锁定。
这个线程是安全的,还是在读取操作期间我也应该锁定?我正在阻止多个线程同时尝试修改数据,但我不知道如果一个线程同时尝试读取另一个线程正在写入会发生什么。