Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/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_Hashmap_Locking_Concurrenthashmap - Fatal编程技术网

Multithreading 无锁哈希表实际上是如何工作的

Multithreading 无锁哈希表实际上是如何工作的,multithreading,hashmap,locking,concurrenthashmap,Multithreading,Hashmap,Locking,Concurrenthashmap,我通过了 及 我不明白这些哈希表怎么会是锁费。我的意思是,如果我们在哈希表getItem和setItem上有两个方法。这是我的职责 function increment2(key): val = hashtable.getItem(key) + 2 hashtable.setItem(val) 现在这个函数在两个线程中运行,如果我不在这个函数中使用锁,hashtable.getItem(key)的值可以增加2或4。 我很困惑,有人能帮我理解一下吗当谈到并发容器时,我们通常指的是

我通过了 及

我不明白这些哈希表怎么会是锁费。我的意思是,如果我们在哈希表getItem和setItem上有两个方法。这是我的职责

function increment2(key):
    val = hashtable.getItem(key) + 2
    hashtable.setItem(val)
现在这个函数在两个线程中运行,如果我不在这个函数中使用锁,hashtable.getItem(key)的值可以增加2或4。 我很困惑,有人能帮我理解一下吗当谈到并发容器时,我们通常指的是为这个容器定义的单个操作是原子的。在您的例子中,
hashtable.getItem(key)
hashtable.setItem(key,val)
是原子操作。例如,如果
.getItem()
.setItem()
同时执行,则它将返回新值或旧值,但不会混合返回

但是并发容器不能保证,它的两个或多个操作的序列是原子的。若用户需要操作序列的原子属性,那个么他不应该期望从容器的实现中得到这个属性,而是手工实现这个属性。在您的例子中,如果您需要
increment2
函数成为原子函数,那么您需要自己实现这个属性

基于锁的并发容器通常可以很容易地修改,以使某些操作序列具有原子性

从另一方面来说,无锁并发容器很难被扩展为具有原子操作序列。从这个意义上说,无锁算法非常脆弱