是否可以在C++中实现无锁映射

Ste*_*eve 18 c++ algorithm dictionary lock-free

我们正在开发一个基于C/S的网络应用程序,我们发现有太多的锁添加到std :: map,服务器的性能变差了.

我想知道是否有可能实现无锁地图,如果有,怎么样?那里有开源代码吗?

编辑:实际上我们使用std :: map来存储套接字信息,我们根据套接字文件描述进行了封装,以包含一些其他必要的信息,如ip地址,端口,套接字类型,tcp或udp等.

总结一下,我们有一张全球地图说它是

map<int fileDescriptor, socketInfor*> SocketsMap, 
Run Code Online (Sandbox Code Playgroud)

那么每个用于发送数据的线程都需要访问SocketsMap,并且他们必须在从SocketsMap读取或写入SocketsMap之前添加互斥锁,因此整个应用程序的并发级别会因为添加到SocketsMap的锁定而大大减少.

为了避免并发级问题,我们有两个解决方案:1.分别存储每个socketInfor*2.使用某种无锁映射.

我想找到某种无锁映射,因为此解决方案所需的代码更改远小于解决方案1所需的代码更改.

Yli*_*sar 15

实际上有一种方法,虽然我没有自己实现,但是使用来自知名C++专家Andrei Alexandrescu的危险指针,在无锁地图上有一篇论文.

  • 请注意,危险指针已获得专利,因此您可能无法在生产代码中使用它。知识产权不是很棒吗? (2认同)

Qar*_*erd 9

是的,我已经使用“拆分有序列表”概念在 C++ 中实现了无锁无序映射( docs )。它是一个自动扩展容器,支持 64 位 CAS 上的数百万个元素,没有 ABA 问题。就性能而言,它是一个野兽(参见第 5 页)。它已经过数百万次随机操作的广泛测试。