c++ - C++ 并发蓝绿模式的解释
问题描述
在这个关于并发的演讲中,Arthur O'Dwyer 解释了“蓝/绿”模式。这看起来像是我想在我的工具箱中拥有的东西,但还没有完全掌握它。
本质上,它为共享状态(即蓝色和绿色)创建了两个类别,并具有:
写入方面,仅当蓝色状态一致时才以原子方式添加修改:
using ConfigMap = std::map<std::string, std::string>; std::atomic<std::shared_ptr<const ConfigMap>> g_config; void setDefaultHostname(std::string const& value) { std::shared_ptr<const ConfigMap> blue = g_config.load(); do { std::shared_ptr<ConfigMap> green = std::make_shared<ConfigMap>(*blue); green->insert_or_assign("default.hostname", value); } while (g_config.compare_exchange_strong(blue, std::move(green))); }
以无锁方式获取当前值的读取端
std::shared_ptr<const std::string> getDefaultHostname() { std::shared_ptr<const ConfigMap> blue = g_config.load(); auto& value = blue.at("default.hostname"); return std::shared_ptr<const std::string>(std::move(blue), &value); }
也就是说,这是我的问题:
- 是否有人(开源库/已建立的项目)在生产中使用它?
- 有更好的解释吗?另一个例子?
- 值得麻烦吗?特别是因为写入端必须重复昂贵的克隆操作,直到蓝色状态仅包含我们的修改。
解决方案
推荐阅读
- c++ - 引用是从函数右值返回的吗?
- python - 烧瓶 request.files 不在“文件”中
- javascript - 提升 reCAPTCHA 的值时“未捕获(承诺中):null”
- flutter - 如何添加 OR 条件来抖动 Firebase 查询
- python - 使用原始音频数据和 simpleaudio 重新调整录制文件后的大量噪音
- javascript - 检查元素是否在 jQuery 选择器中具有提供的父元素
- c - 访问 C 数组线程中的不同元素是否安全?
- java - java中while循环的时间复杂度
- linux - 使用tar时保存文件名
- java - 图像未在 JavaFX 中显示