我们正在开发一个基于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所需的代码更改.
在我目前的情况下,速度是必不可少的,我有一个只有多线程读取的地图,这很好.现在出现了一个要求,可能需要偶尔写入静态映射,而其他线程正在读取映射.我相信这是一个游戏规则改变者,因为我需要锁定我的地图以保证线程的安全.这造成了一个问题,因为我有多个线程10-12个线程将要读取地图.如果一张地图在地图上锁定(因为它的读数),我相信锁定是必要的,因为可能会将某些内容写入地图.无论如何,正如我之前所说,如果一张地图正在阅读,那么其他地图就不会像之前那样对地图进行并行读取访问.有什么办法可以绕过这个问题吗?