Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 使用线程以并发方式访问结构字段_Multithreading_Data Structures_Concurrency_Mutex - Fatal编程技术网

Multithreading 使用线程以并发方式访问结构字段

Multithreading 使用线程以并发方式访问结构字段,multithreading,data-structures,concurrency,mutex,Multithreading,Data Structures,Concurrency,Mutex,假设我有一个包含很多字段的数据结构。我想使用线程以并发方式访问它。无论如何,我不想锁定整个结构(例如使用大互斥锁对其进行完全独占访问),但我希望一个线程可以访问一个字段,即使其他线程正在访问其他字段。 可能吗?如果是,怎么做?简单的方法是,假设您能够负担内存开销,则使用一个单独的互斥来保护每个字段 编辑:由于您讨论的是哈希表,锁定每个插槽会产生太多开销,而单个锁的效率太低 最可接受的方法是锁条技术,这意味着维护K个锁,每个锁保护M/K插槽(其中M为插槽总数)。然后,您可以运行一些基准测试并调优K

假设我有一个包含很多字段的数据结构。我想使用线程以并发方式访问它。无论如何,我不想锁定整个结构(例如使用大互斥锁对其进行完全独占访问),但我希望一个线程可以访问一个字段,即使其他线程正在访问其他字段。
可能吗?如果是,怎么做?

简单的方法是,假设您能够负担内存开销,则使用一个单独的互斥来保护每个字段

编辑:由于您讨论的是哈希表,锁定每个插槽会产生太多开销,而单个锁的效率太低


最可接受的方法是锁条技术,这意味着维护K个锁,每个锁保护
M/K
插槽(其中M为插槽总数)。然后,您可以运行一些基准测试并调优K以获得最佳性能。

您可以对整个哈希表使用一个锁,而不是使用一堆锁,而是为表中的每个元素使用一个标志。标志表示该元素当前正被其他人使用,任何想要使用它的人都必须稍等。所以,要从表中获取一个元素,需要通过单锁,但一旦获取了元素,就要释放它。然后检查是否允许使用该元素。如果没有,请稍等,然后再次检查

如果可以从哈希表中删除元素,则每个元素都必须有一个引用计数,这样,只有当引用计数降至零时,才能删除元素并将其从表中删除


当新元素添加到表中时,它是在表的锁中完成的。锁也用于删除元素。希望访问现有元素比创建新元素和删除现有元素更频繁。

Java和ConcurrenSkipListSet在这种情况下非常非常有效。它还有一个ConcurrentHashMap,在多线程环境中速度不是很快,但它是线程安全的。我想在大多数语言中都会有类似的东西。跳过列表的想法(一个像字典/映射一样的单链接列表,使用比较和交换而不是锁定)是相当新的,但是具有自己锁定功能的哈希表已经存在了很久。(如果你不使用Java,也找不到什么东西,Java是开源的,所以你可以翻译代码,自己制作。)

我觉得这有点过早优化的味道。每个字段周围都有锁,这将使您的复杂性大大提高。只有当探查器告诉您这是一个性能问题时,我才会这样做。有任何特定的语言吗?如果放置语言标记,您将获得更多视图。您是否需要访问它以更改字段?或者只是读一下?如果要对字段进行变异,则需要一个复杂的锁定方案来提高效率。它适用于哈希表。。。应该有多少字段?(是否有任何非直接的方法?)