C ++ set / get方法同步

时间:2015-09-06 08:58:01

标签: c++ c++11 concurrency mutex

让我们在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)都应该:

  • 阻止对方 - 以避免对象状态不一致,
  • 阻止所有getMethods - 以避免返回部分更改的数据,
  • 被所有getMethods阻止 - 以避免返回部分更改的数据。

使用互斥锁的简单lock_guard将满足除一个之外的所有要求 - getMethod将阻止其他getMethods。

在这种情况下,什么解决方案容易和干净?

2 个答案:

答案 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应解决有关部分更改数据的任何问题。

[编辑:]不,它没有。如果我不删除这个错误的答案,那只是为了保留应该保留的富有洞察力的评论。