(最好是提升)无锁阵列/矢量/地图/等?

时间:2013-03-11 02:15:23

标签: c++ multithreading performance multidimensional-array lock-free

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

这是我的计划https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cpp

的支柱

我正在使用websocket ++构建一个websocket服务器(哦,我很强烈建议使用websocket ++。我可以轻松地安全地操作每个用户数据线程,因为它实际上不需要被不同的线程操纵;但是,我确实希望能够写入一个数组(我将在一个函数线程中使用来自较弱的语言,如vb,php,js的catch-all术语“数组”)(可以运行多次迭代)同时)并读取一个或多个线程。

以堆栈为例:如果我希望以特定方式排序所有文章的所有id s(PRIMARY列),在这种情况下通过网络投票,并保留记忆,我想我会有一个在其自己的boost::thread中调用的函数,每当对该网站进行投票以重新排序该数组时就会触发该函数。

如何在没有锁定的情况下完成此操作堵?当用户从旧阵列读取而另一个正在构建时,我100%罚款,但我绝对不希望他们的读取或线程写入永远失败/被阻止。

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

2 个答案:

答案 0 :(得分:4)

你看过Boost.Lockfree吗?

答案 1 :(得分:1)

呃,呃,呃。复杂。

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

我的猜测是,多个作家不会同时工作。您应该寻找比数组更有效的表示,这样可以实现更快的更新。平衡的树怎么样? log(n)永远不应该以明显的方式阻止任何事情。

关于提升 - 我很高兴它最终对线程同步有适当的支持。

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