我正在尝试设计一个可以作为数据持有者(包含许多成员、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;
}
};
问题:
- 创建和共享此类实例
singleton
、const DataStore&
或shared_ptr<DataStore>
的最佳方式是什么 - 即使调用
setMember
只发生在一个地方,我们是否需要使其线程安全?有什么可能使其线程安全?现有的代码能工作吗 - 有些setter可以非常频繁地调用,我需要将成员作为参考
DataType& _member;
吗
创建和共享此类实例的最佳方式是什么,singleton还是
const DataStore&
或shared_ptr<DataStore>
?
当您选择singleton或shard_ptr时,对类对象的访问始终是读取操作。(我不明白const DataStore&
是什么意思。(
即使只在一个地方调用setMember,我们是否需要使其线程安全?有什么可能使其线程安全?现有的代码能工作吗?
getMember
返回常量左值引用。这样你的代码就不会锁定任何东西。复制对象或锁定此类之外的数据访问。
您需要确保读取操作和写入操作不会同时发生。
有些setter可以被频繁调用,我是否需要将成员作为引用,DataType&_成员
正如已经指出的,您应该在类之外使用std::shared_mutex
来避免对象复制。这意味着您可以简单地删除DataStore
类,因为不再需要它们。