【发布时间】:2017-09-29 13:18:41
【问题描述】:
我正在编写一个网络服务,它接收原始数据包然后将它们转换并将它们放入队列中,还有几个工作线程从队列中获取转换后的数据包并根据一些规则更新哈希映射。为了防止来自不同工作线程的哈希映射的并发更新,我必须使用互斥锁。不幸的是,使用互斥锁会对性能造成很大影响。我需要为此找到解决方法。
编辑: 转换后的数据包包含一个sessio_id,这个session_id被用作hash-map key。在任何插入或更新之前,首先搜索 session_id,如果没有找到 session_id,则 添加一个新条目,这正是我使用互斥锁的地方,否则如果 session_id 已经存在,我只是 更新 现有值,并且没有用于单纯值更新的互斥锁。知道我使用 boost::unordered_map 作为底层哈希映射可能会有所帮助。
下面是我使用的逻辑的伪代码:
if hash.find(session_id) then
hash.update(value)
else
mutex.lock()
hash.insert(value)
mutex.unlock()
end
你有什么建议?
顺便说一下,这是我的工作环境和工具:
编译器:C++(gcc)
线程库:pthread
操作系统:Ubuntu 14.04
【问题讨论】:
-
我认为您需要添加从 hashmap 中读取的频率、更新 hashmap 的频率以及您拥有的 hashmap 的读者数量。
-
@SergeiKurenkov 我添加了一些细节:)
-
我认为您在这里遇到了错误:
otherwise if the session_id already exists I just update the existing value and there is no mutex lock used for mere value update。添加一个新的key会导致hashmap在内部重新分配内存,同时在另一个线程中访问一个key肯定会导致错误。 -
当其他线程正在插入东西时,您无法在互斥锁之外搜索地图。
-
顺便说一句,我没有看到您更新的答案中读取/秒、写入/秒和读者数量的确切数字。
标签: c++ multithreading performance hashmap network-programming