【发布时间】:2012-12-29 14:39:01
【问题描述】:
我们正在开发基于 C/S 的网络应用程序,我们发现添加到 std::map 的锁太多,导致服务器性能变差。
我想知道是否可以实现无锁地图,如果可以,如何实现?那里有开源代码吗?
编辑: 实际上我们使用std::map来存储sockets信息,我们根据socket文件描述做了封装,包含一些其他必要的信息,比如ip地址、端口、socket类型、tcp或udp等。
总而言之,我们有一张全球地图说它是
map<int fileDescriptor, socketInfor*> SocketsMap,
那么每个用于发送数据的线程都需要访问SocketsMap,并且在从SocketsMap读取或写入SocketsMap之前必须添加互斥锁,这样会因为添加这么多锁而大大降低整个应用程序的并发度到 SocketsMap。
为了避免并发级别问题,我们有两种解决方案:1. 分别存储每个 socketInfor* 2. 使用某种无锁映射。
我想找一种无锁地图,因为这个方案需要的代码改动比方案一要少很多。
【问题讨论】:
-
@WhozCraig 平心而论,这里特指 C++,而特指 C... 它们是非常不同的语言,尤其是当您考虑原子变量时。
-
@AlexChamberlain 说得很好,先生。我会拉下链接。
-
如果您需要一个关联容器,但不需要排序,使用像
std::unordered_map这样的哈希可能更简单。即使使用当前的粗锁定(特别是如果您可以将任何昂贵的哈希计算移到锁定部分之外),它可能会更快,但我怀疑偶尔昂贵的重新哈希也比偶尔的重新平衡更容易处理,对于乐观者无锁版本。 -
读者与作者的比例是多少?
-
@brianbeuning 我编辑了帖子,请参阅编辑部分。
标签: c++ algorithm dictionary lock-free