假设我有一个包含很多字段的数据结构。我想使用线程以并发方式访问它。无论如何,我不想锁定整个结构(例如,使用大型互斥锁对它进行完全独占访问),但我希望即使其他线程正在访问OTHER字段,线程也可以访问该字段。 可能吗?如果有,怎么样?
答案 0 :(得分:1)
Java有ConcurrentSkipListMap和ConcurrenSkipListSet非常适用于这样的情况。它还有一个ConcurrentHashMap,它在多线程环境中不是那么快,但是是线程安全的。我认为大多数语言都会提供类似的东西。跳过列表的想法(一个单独链接的列表,就像一个字典/映射,使用比较和交换而不是锁定)是相当新的,但是执行自己锁定的哈希表已经永远存在。 (如果你不使用Java而且找不到东西,那么Java就是开源的,所以你可以翻译代码并制作你自己的代码。)
答案 1 :(得分:0)
直接的方法是使用单独的互斥锁保护每个字段,假设您可以负担内存开销。
编辑:由于您正在讨论哈希表,因此锁定每个插槽会产生太多开销,而单个锁定效率太低。
最可接受的方式是锁定条带技术,这意味着保持K锁,每个锁保护M/K
个插槽(M的总插槽数)。然后,您可以运行一些基准测试并调整K以获得最佳性能。
答案 2 :(得分:0)
而不是拥有大量的锁,你只能拥有一个整个哈希表,但是为表中的每个元素使用一个标志。 Flag表示该元素当前由其他人使用,并且想要使用它的人必须等待一点。因此,要从表中获取元素,您需要通过单个锁定,但只要获得元素,就可以释放它。之后,检查是否允许您使用该元素。如果不等一点再检查一下。
如果可以从哈希表中删除元素,则必须具有每个元素的引用计数,以便您可以删除元素并仅在引用计数降至零时将其从表中删除。
当新元素添加到表中时,它在表的锁内完成。锁也用于删除元素。希望访问现有元素比创建新元素和删除现有元素更频繁。