正在搜索交换两个关联容器的无锁可能性
Searching for a lock-free possibility to swap two associative containers
我正在尝试实现特性切换模式。为此,我将包含功能切换的配置文件的内容加载到地图中。之后,有一个功能可以检查是否设置了功能切换。现在,我们的部分开发需要一个函数来重新初始化映射,这样他们就可以在应用程序运行时更改切换(编辑文件,调用重新初始化)。
由于切换机制应该很快,我想实现最快的方式来读取切换。重新初始化映射可能很慢,这没有问题。读而不写是线程安全的,但对于重新初始化函数,我需要关心线程问题。
我目前的解决方案在读函数中使用读锁,在写函数中使用排他锁。但我的目标是在读函数中没有锁。有什么想法吗?
问候Tobias
唯一不安全的操作应该是那些修改树结构的操作。简单地更新节点中的值是安全的。因此,在"重新初始化"时,只需访问"旧"树中的每个节点,如果新配置没有设置,则保持不变或将值更改为"未知"状态。如果新配置在现有树中有一个节点的设置,只需更新它并继续。
如果你真的,真的需要能够动态添加新的功能切换(为什么?),你可以制作第二个数据结构,它只是一个愚蠢的、扁平的"添加"功能列表,并且只附加在那里。然后,当读者查询某个功能时,先在树中查找(快速),然后在需要时在列表中查找(缓慢但不常见)。
最后,您可以做一些类似于"z缓冲"的操作,其中保留两个完整的树和一个指向"活动"树的指针。您只更新"非活动"的一个,然后翻转指针使其处于活动状态。当读卡器使用活动树时,这可能需要一个简单的引用计数操作(因此,当一些读卡器存在于旧树上时,您不会进行第二次更新),但这应该很便宜。
相关文章:
- 关联容器的下界复杂性:成员函数与非成员函数
- std::future_error:无关联状态
- 查找自动生成键并具有线性内存消耗的小型关联数组
- 如何在 OpenCV 中将图像与另一个图像相关联
- 删除提升存档对象也会删除与其关联的流?
- 变量如何以及在何处可能没有C++关联的名称?
- 将正态随机变量与任意 RHO(corrcoef) 相关联
- 如何降低生产者获得锁的可能性,而消费者在使用std::condition_variable时无法获得锁?
- 试图(稍微)概括C++模板.关联容器键:值反转
- 如何打印源文件中与 GDB 中的程序流关联的所有行号
- 当前不会命中断点。没有调试器目标代码类型的可执行代码与此文件关联
- 与 std::unique_ptr 和抽象类关联的编译错误
- 如何创建一个对象创建函数,该函数将由与其关联的名称调用?
- 访问与使用 TraceLoggingWrite 提供的事件关联的用户数据
- 创建一个结构的关联数组,以创建一个缓冲区,供键快速访问
- c++:在switch中使用std::pair的可能性
- 如何在 c++ 中创建分组多重映射键和关联值的表
- 为什么标准关联有序容器允许"const char*"作为其键?
- 如何使用 PHPCPP 传递对象数组,遍历每个对象并返回关联数组
- 正在搜索交换两个关联容器的无锁可能性