holder类的设计,该类将用于在程序中的多个位置存储数据



我正在尝试设计一个可以作为数据持有者(包含许多成员、getter和setter(的类。该类应在程序中的多个其他线程中使用,并可用于数据交换,即一个组件更新对象,其他组件可以在需要时读取更改后的值。

即使成员的写入(通过调用setter(只能在一个地方发生,getter也可以在多个地方调用。

下面是类代码。

#include <mutex>
class DataType{};
class DataStore
{
private:
mutable std::mutex _mtx;
DataType _member;
// different other member!
public:
DataStore(): _member(){}
~DataStore(){}
// setters can be called from many places!
void setMember(const DataType& val)
{
std::lock_guard<std::mutex> lock(_mtx);
_member = val;
}
// getters can be called from many places!
const DataType& getMember() const
{
std::lock_guard<std::mutex> lock(_mtx);        
return member;
}
};

问题:

  • 创建和共享此类实例singletonconst DataStore&shared_ptr<DataStore>的最佳方式是什么
  • 即使调用setMember只发生在一个地方,我们是否需要使其线程安全?有什么可能使其线程安全?现有的代码能工作吗
  • 有些setter可以非常频繁地调用,我需要将成员作为参考DataType& _member;

创建和共享此类实例的最佳方式是什么,singleton还是const DataStore&shared_ptr<DataStore>

当您选择singleton或shard_ptr时,对类对象的访问始终是读取操作。(我不明白const DataStore&是什么意思。(

即使只在一个地方调用setMember,我们是否需要使其线程安全?有什么可能使其线程安全?现有的代码能工作吗?

getMember返回常量左值引用。这样你的代码就不会锁定任何东西。复制对象或锁定此类之外的数据访问。

您需要确保读取操作和写入操作不会同时发生。

有些setter可以被频繁调用,我是否需要将成员作为引用,DataType&amp_成员

正如已经指出的,您应该在类之外使用std::shared_mutex来避免对象复制。这意味着您可以简单地删除DataStore类,因为不再需要它们。

相关内容

  • 没有找到相关文章

最新更新