Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.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
Arrays 在.NET中,我们可以在多线程处理时向列表中添加元素而不同步它吗?_Arrays_Vb.net_Parallel Processing_Locking_Race Condition - Fatal编程技术网

Arrays 在.NET中,我们可以在多线程处理时向列表中添加元素而不同步它吗?

Arrays 在.NET中,我们可以在多线程处理时向列表中添加元素而不同步它吗?,arrays,vb.net,parallel-processing,locking,race-condition,Arrays,Vb.net,Parallel Processing,Locking,Race Condition,通常,要在多线程处理时访问共享变量,我们需要执行以下操作并对其进行同步: '''This is VB code. 'Lock variable to request access and wait. Monitor.Enter(list1) Try list1.item(i) = 42 Finally Monitor.Exit(Me) End Try 但是,如果我想在特定的i位置向列表中添加元素,那么我是否需要执行此锁定?这个i值只会被编辑一次,所以我不需要担心索引会被更改两次

通常,要在多线程处理时访问共享变量,我们需要执行以下操作并对其进行同步:

'''This is VB code. 
'Lock variable to request access and wait. 
Monitor.Enter(list1)
Try
    list1.item(i) = 42
Finally
  Monitor.Exit(Me)
End Try
但是,如果我想在特定的
i
位置向列表中添加元素,那么我是否需要执行此锁定?这个
i
值只会被编辑一次,所以我不需要担心索引会被更改两次


如果我设置的是数组或数组列表,会发生什么?如果我确定不编辑索引两次,那么使用什么最快

如果您不担心多个线程更改同一对象,您甚至不需要执行锁定。我不认为我曾经对已经存在的项使用过锁定(除了一个非常特殊的情况),只是为了更改数组/集合的大小(在本例中)

顺便说一句,你应该看看他们本质上是一样的。MS说,“Enter和Exit方法提供的功能与C#lock语句(visualbasic中的SyncLock)提供的功能相同,只是lock和SyncLock将Exit方法包装在try…finally块(visualbasic中的try…finally)中,以确保释放监视器。”修改列表元素不会以任何方式改变列表对象的内部状态。换句话说,代码不能损坏列表对象本身,因此不需要锁定


但是,当迭代列表的另一个线程能够观察到更改的元素时,这是完全不可预测的。它很有可能看到列表元素的过时或部分更新的值。元素类型非常重要,它需要是原子的,以避免另一个线程看到部分更新的值。只有整数或更小的值类型和引用类型引用保证是原子的。陈旧性和原子性问题几乎总是需要锁定,以避免不可调试的随机故障。

值得一看的答案就是这一点<代码>线程安全集合是我在这个问题下搜索的内容,因为我不一定需要使用经典的
列表
。我不知道这些集合是存在的。因此,如果我
.add()
将一个项目添加到列表中,那么我需要锁定,但是如果它是一个特定的
I
,就像我的问题中那样,就不需要锁定了,对吗?你能告诉我锁定它的最简单方法吗(并告诉我是否需要在
并行模式下进行此操作。对于
):
I+=1