我正在编写一些设置类,可以从我的多线程应用程序中的任何地方访问。我会经常阅读这些设置(因此读取访问应该很快),但它们不会经常写入。
对于原始数据类型,它看起来boost::atomic
提供了我需要的东西,所以我想出了这样的东西:
class UInt16Setting
{
private:
boost::atomic<uint16_t> _Value;
public:
uint16_t getValue() const { return _Value.load(boost::memory_order_relaxed); }
void setValue(uint16_t value) { _Value.store(value, boost::memory_order_relaxed); }
};
问题1:我不确定内存排序。我认为在我的应用程序中我并不真正关心内存排序(是吗?)。我只是想确保它getValue()
总是返回一个未损坏的值(旧的或新的)。那么我的内存排序设置是否正确?
问题 2:这种方法是否boost::atomic
推荐用于这种同步?还是有其他结构可以提供更好的读取性能?
我的应用程序中还需要一些更复杂的设置类型,std::string
例如boost::asio::ip::tcp::endpoint
s 列表。我认为所有这些设置值都是不可变的。因此,一旦我使用 设置值setValue()
,值本身(std::string
或端点列表本身)就不再改变。因此,我只想确保获得旧值或新值,而不是某些损坏的状态。
问题 3:这种方法适用于boost::atomic<std::string>
吗?如果不是,有什么替代方案?
问题 4:更复杂的设置类型,如端点列表?你会推荐类似的东西boost::atomic<boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>>>
吗?如果没有,什么会更好?