C++ set/get方法同步

Dej*_*jwi 4 c++ concurrency mutex c++11

让我们考虑一下C++中的这样一个类:

class CuteClass
{
public:
  int    getFancyInt() const;
  float  getNiceFloat() const;
  string getPerfectString() const;

  void setIntSomething(int something);
  void setInternalState(State newState);
};
Run Code Online (Sandbox Code Playgroud)

可以从几个不同的线程同时访问此类的实例.然后:

所有getMethods(getFancyInt,getNiceFloat,getPerfectString)都不应该相互阻塞.它们不会更改对象的内部状态.

所有setMethod(setIntSomething,setInternalState)都应该:

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

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

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

小智 6

您正在寻找的是R/W互斥体.

你在所有的getter中将其锁定为"READ",并在所有setter中将其"WRITE"锁定.

Boost shared_mutex正是您所寻找的

boost shared_mutex的示例(多次读取/一次写入)?

为了与"const"声明兼容,您需要将互斥锁本身声明为可变的

  • 从C++ 17开始,我们也将拥有`std :: shared_mutex`. (2认同)

Joa*_*m W 3

std::atomic应该解决对部分更改数据的任何担忧。

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

  • `std::atomic` 也适用于用户定义的类型,但可能涉及锁。 (2认同)