让我们在C ++中考虑这样一个类:
class CuteClass
{
public:
int getFancyInt() const;
float getNiceFloat() const;
string getPerfectString() const;
void setIntSomething(int something);
void setInternalState(State newState);
};
可以从几个不同的线程同时访问此类的实例。然后:
所有getMethods(getFancyInt,getNiceFloat,getPerfectString)都不应该相互阻塞。它们不会改变对象的内部状态。
所有setMethod(setIntSomething,setInternalState)都应该:
使用互斥锁的简单lock_guard将满足除一个之外的所有要求 - getMethod将阻止其他getMethods。
在这种情况下,什么解决方案容易和干净?
答案 0 :(得分:6)
你喜欢的是R / W互斥体。
你在所有的getter中将其锁定为“READ”,并在所有setter中将其“WRITE”锁定。
Boost shared_mutex就是你要找的东西
Example for boost shared_mutex (multiple reads/one write)?
为了与“const”声明兼容,您需要将互斥锁本身声明为可变
答案 1 :(得分:3)
std::atomic
应解决有关部分更改数据的任何问题。
[编辑:]不,它没有。如果我不删除这个错误的答案,那只是为了保留应该保留的富有洞察力的评论。