正在搜索交换两个关联容器的无锁可能性

Searching for a lock-free possibility to swap two associative containers

本文关键字:关联 可能性 两个 搜索 交换      更新时间:2023-10-16

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

由于切换机制应该很快,我想实现最快的方式来读取切换。重新初始化映射可能很慢,这没有问题。读而不写是线程安全的,但对于重新初始化函数,我需要关心线程问题。

我目前的解决方案在读函数中使用读锁,在写函数中使用排他锁。但我的目标是在读函数中没有锁。有什么想法吗?

问候Tobias

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

如果你真的,真的需要能够动态添加新的功能切换(为什么?),你可以制作第二个数据结构,它只是一个愚蠢的、扁平的"添加"功能列表,并且只附加在那里。然后,当读者查询某个功能时,先在树中查找(快速),然后在需要时在列表中查找(缓慢但不常见)。

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