我需要修改一个程序:
-
i/o线程A,从流接收数据,
-
根据a获取和设置的全局参数进行批处理的工作线程X, Y和Z。
但是,当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
来管理参数对象的生命周期。