gpt4 book ai didi

c++ - 线程安全设置

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:31 31 4
gpt4 key购买 nike

我正在编写一些可以在我的多线程应用程序中随处访问的设置类。我会经常读取这些设置(因此读取访问应该很快),但不会经常写入它们。

对于原始数据类型,它看起来像 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 的列表秒。我认为所有这些设置值都是不可变的。因此,一旦我使用 setValue() 设置值,值本身(std::string 或端点列表本身)不再更改。因此,我只想确保我得到的是旧值或新值,而不是一些损坏的状态。

问题 3:此方法是否适用于 boost::atomic<std::string> ?如果不是,有哪些替代方案?

问题 4: 端点列表等更复杂的设置类型如何?你会推荐像boost::atomic<boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>>>这样的东西吗? ?如果没有,什么会更好?

最佳答案

Q1,如果您在读取原子变量后不尝试读取任何共享的非原子变量,则更正。内存屏障仅同步对原子操作之间可能发生的非原子变量的访问

Q2 我不知道(但见下文)

Q3 应该工作(如果编译)。然而,

 atomic<string> 

可能不是免费的

Q4 应该可行,但同样,实现不可能是无锁的(实现无锁 shared_ptr 是一个具有挑战性的专利挖掘领域)。

因此,如果您的配置包含大小超过 1 个机器字的数据(CPU native 原子通常适用于此),读者-作者锁(如 Damon 在评论中建议的那样)可能会更简单甚至更有效

[编辑]但是,

atomic<shared_ptr<TheWholeStructContainigAll> > 

甚至是非无锁的也可能有一些意义:这种方法为需要多个连贯值的读者最小化了冲突概率,尽管编写者每次更改某些内容时都应该制作整个“参数表”的新拷贝。

关于c++ - 线程安全设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19727348/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com