寻找无锁的可能性来交换两个关联容器

时间:2013-07-06 09:28:57

标签: c++ multithreading thread-safety

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

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

我当前的解决方案在读取功能中使用读取器锁定,在写入功能中使用独占锁定。但我的目标是在读取功能中没有锁定。有什么想法吗?

此致 托拜厄斯

1 个答案:

答案 0 :(得分:1)

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

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

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