Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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

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
C# 并发skiplist读取锁定_C#_Multithreading_Algorithm_.net 4.0 - Fatal编程技术网

C# 并发skiplist读取锁定

C# 并发skiplist读取锁定,c#,multithreading,algorithm,.net-4.0,C#,Multithreading,Algorithm,.net 4.0,我会尽量把这个问题概括起来,但我会简单介绍一下我的实际问题- 我正在尝试为优先级队列实现并发skiplist。每个“节点”都有一个值和一个“转发”节点数组,其中node.forward[i]表示skiplist第i级上的下一个节点。对于写访问(即插入和删除),我使用自旋锁(仍然要确定这是否是最好使用的锁) 我的问题基本上是,当我需要一个读取访问权限进行遍历时 node = node.forward[i] 在这种情况下,我需要什么样的线程安全性?如果另一个线程在我读取的同一时间修改node.fo

我会尽量把这个问题概括起来,但我会简单介绍一下我的实际问题-

我正在尝试为优先级队列实现并发skiplist。每个“节点”都有一个值和一个“转发”节点数组,其中node.forward[i]表示skiplist第i级上的下一个节点。对于写访问(即插入和删除),我使用自旋锁(仍然要确定这是否是最好使用的锁)

我的问题基本上是,当我需要一个读取访问权限进行遍历时

node = node.forward[i]
在这种情况下,我需要什么样的线程安全性?如果另一个线程在我读取的同一时间修改node.forward[i](没有当前的读取锁定机制),这里会发生什么

我最初的想法是在前进的索引器的getter和setter上有一个readerwriterlocksim。在这种情况下会有太多不必要的锁定吗

编辑:还是最好使用一个联锁的.交换来交换我所有的读取

如果另一个线程在我读取的同一时间修改node.forward[i](没有当前的读取锁定机制),这里会发生什么

这实际上取决于实施情况。可以在设置“前进”时使用,以防止引用无效(因为它可以使“设置”原子化),但无法保证在读取时会得到哪个引用。然而,使用一个简单的实现,任何事情都可能发生,包括获取坏数据

我最初的想法是在前进的索引器的getter和setter上有一个readerwriterlocksim

这可能是一个很好的起点。使用
ReaderWriterLockSlim
可以很容易地创建一个正确同步的集合,而功能始终是首要任务

这可能是一个很好的起点

在这种情况下会有太多不必要的锁定吗

如果看不到您如何实现它,更重要的是,如何使用它,就无法知道。根据您的使用情况,您可以在必要时分析并寻找优化机会


另一方面,您可能需要重新考虑使用
node.Forward[i]
,而不是使用更多的“链表”方法。对
Forward[i]
的任何访问都可能需要相当多的同步来迭代跳过列表
i
步骤,如果
node
i
元素之间在
node
之外的任何位置存在并发写入,则所有这些步骤都需要一些同步来防止出错。如果只向前看一步,就可以(潜在地)减少所需的同步量

node.Forward[3]并不表示“此节点之后的节点3”,它表示跳过列表第3层上的下一个节点。我认为这是实现跳过列表的一种相当标准的方法,不管是否并发。感谢您的回复。+1因为跳过列表非常棒:D