3

我正在尝试实现功能切换模式。为此,我将包含功能切换的配置文件的内容加载到地图中。之后,有一个功能可以检查是否设置了功能切换。现在,我们开发的一部分需要一个函数来重新初始化地图,以便他们可以在应用程序运行时更改切换(编辑文件,调用重新初始化)。

由于切换机制应该很快,我想实现最快的方式来读取切换。重新初始化地图可能会很慢 - 这没问题。不写就读是线程安全的,但是使用重新初始化功能,我需要关心线程问题。

我当前的解决方案在读取函数中使用读取器锁,在写入函数中使用排他锁。但我的目标是在读取函数中没有锁。有任何想法吗?

问候托拜厄斯

4

1 回答 1

1

唯一不安全的操作应该是那些修改树结构的操作。简单地更新节点中的值是安全的。因此,当“重新初始化”时,只需访问“旧”树中的每个节点,如果新配置没有设置,要么保持不变,要么将值更改为“未知”状态。如果新配置在现有树中有一个节点的设置,只需更新它并继续。

如果您真的,真的需要能够即时添加新功能切换(为什么?),您可以创建第二个数据结构,它只是一个“添加”功能的愚蠢、扁平列表,并且只附加到那里。然后,当读者查询某个特征时,首先查看树(快速),然后在需要时查看列表(慢,但不常见)。

最后,您可以执行“z 缓冲”之类的操作,在其中保留两棵完整的树和指向“活动”树的指针。您只需更新“非活动”的,然后翻转指针使其处于活动状态。当读者使用活动树时,这可能需要一个简单的引用计数操作(因此当一些读者存在于旧树上时,您不会第二次更新),但这应该不贵。

于 2013-07-06T11:52:22.517 回答