1

考虑到我缺乏 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% 没问题,但我绝对不希望他们的读取或线程写入失败/被阻塞。

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

4

2 回答 2

4

你看过Boost.Lockfree吗?

于 2013-03-11T02:22:53.683 回答
2

呃,呃,呃。复杂。

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

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

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

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

于 2013-03-11T02:24:07.750 回答