multithreading - (概念)当线程在执行期间更改程序参数时使用哪种技术/模式?(多线程)
问题描述
我需要改变一个程序:
i/o 线程 A,从流中接收数据,以及
工作线程 X、Y 和 Z,根据 A 获取和设置的全局参数进行批处理。
但是,当 X、Y 和 Z 正在处理数据时,A 不能更改这些参数,否则数据将被损坏。更改应仅对下一批有效。
我的脑海里闪过很多想法:
-1。当 A 收到更改时,它会在完成最新批次后停止 XYZ。然后它会更改全局参数并允许 XYZ 恢复。
-2。XYZ 保留全局参数的本地副本,并在每次完成批处理时更新它,从而接受任何更改。当 A 更改参数时,XYZ 必须等待才能访问它们。(我相信这种技术称为互斥锁)。
在考虑它的同时,我想到这一定是一个相当普遍的情况,并且对此的解决方案必须已经存在。是否有解决此问题的模式(可能是 1 或 2 个已确定的名称)?如果不是,您如何看待提案 1 和提案 2?一个互斥体看起来足以满足 2,但如何实现 1 呢?
解决方案
线程 A 维护一个指向不可变参数对象的 volatile/atomic 指针。
X/Y/Z 在处理批处理之前获取自己的此指针副本,并使用参数对象。
当 A 获得参数更改时,它会创建一个全新的参数对象并更新指向它的指针。
如果您正在使用带有垃圾收集的语言,那么您只需要担心这些。如果您使用的是 C++,那么您可以使用它std::shared_ptr
来管理参数对象的生命周期。
推荐阅读
- api - Slate 无法显示来自 swagger 2.0 的示例值
- java - GSON 应为字符串,但在第 1 行第 14 列路径 $.dCharg 处为 BEGIN_OBJECT
- python - 如何从 github python 安装“sparse_dot_topn”
- ios - 从中国商店最好的方法中禁用Callkit?
- javascript - JavaScript - 等待异步函数完成
- javascript - chrome扩展拒绝执行内联脚本
- python - 准确度/损失图中的数字缺失点
- jquery - jQuery Lightbox 2 在随机图像中显示边框
- node.js - 子模块是否存在相反或相反的情况?
- php - 如何在对 XPLAN API 的 CURL 请求中构造 edai.Search 方法的第三个参数?