(最好是提升)无锁数组/向量/地图/等?

Posted

技术标签:

【中文标题】(最好是提升)无锁数组/向量/地图/等?【英文标题】:(preferably boost) lock-free array/vector/map/etc? 【发布时间】:2013-03-11 02:15:22 【问题描述】:

考虑到我缺乏 C++ 知识,请尝试阅读我的意图,而不是我糟糕的技术问题。

这是我的程序的主干https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cpp

我正在使用 websocket++ 构建一个 websocket 服务器(哦,websocket++ 很不错。我强烈推荐),并且我可以轻松地线程安全地操作每个用户数据,因为它确实不需要由不同的线程来操作;但是,我确实希望能够在一个函数线程中写入一个数组(我将使用来自 vb、php、js 等较弱语言的包罗万象的术语“数组”)(可以运行多个迭代)同时)并读入 1 个或多个线程。

以堆栈为例:如果我想让所有ids(所有文章的PRIMARY 列)以特定方式排序,在这种情况下按净投票排序,并保存在内存中,我'我想我会有一个在它自己的boost::thread 中调用的函数,每当网站上的投票进入以重新排序数组时就会触发。

如何在不锁定和阻塞的情况下做到这一点?我可以 100% 接受用户从旧数组读取而另一个正在构建,但我绝对不希望他们的读取或线程写入失败/被阻塞。

是否存在无锁数组?如果没有,是否有某种方法可以在临时数组中构建新数组,然后在构建完成时将其写入实际数组而无需锁定和阻塞?

【问题讨论】:

我不确定您避免锁定/阻塞的要求来自哪里,或者它有多严格,但是如果您在临时数据结构中构建“数组”(而原始数据正在使用对于访问),您可以使用标准 STL swap() 操作在完成后将其交换到位。这不是原子的,因此在交换操作期间需要锁定,但它是一个相对“快速”的操作,因此您的“数组”不会被锁定很长时间并且它是“安全的”。 (关于你的问题,我个人不知道有什么方法可以在没有锁定/阻塞的情况下在 C++ 中执行你所要求的操作。) (顺便说一句,如果您确实使用swap() 实现了此功能,那么您将希望使用“读取器/写入器”锁定模式,顺便说一句。) 整个问题对我来说都是“过早的优化”。你是否真的分析过你的程序在真实场景中运行,并表明你从@Turix 的方法中获得的最小锁会导致问题? 【参考方案1】:

你看过Boost.Lockfree吗?

【讨论】:

【参考方案2】:

呃,呃,呃。复杂。

看这里(例如):RCU——这只是关于多次读取和一次写入。

我的猜测是多个作家同时工作是行不通的。您应该寻找一种比数组更有效的表示,一种允许更快更新的表示。平衡树怎么样? log(n) 不应该以明显的方式阻塞任何东西。

关于 boost——我很高兴它终于对线程同步有了适当的支持。

当然,您也可以保留一份副本并批量更新。然后后台进程合并更新并将结果复制给读者。

【讨论】:

也许可以试试数据库索引。 mysql 可以在 RAM 中存储表和索引。

以上是关于(最好是提升)无锁数组/向量/地图/等?的主要内容,如果未能解决你的问题,请参考以下文章

安卓地图哪个好

寻asp。net高手请教百度地图API问题。最好是精通js语言。

安卓啥导航地图最好,要有离线地图

最好用正确的值实例化对象然后推送到向量,或者实例化,推送到向量然后设置正确的值?

节点预分配向量中的无锁树节点分配

DeepRacer 找到的最好的奖励函数 reward function