操作列表<;array[]>;,这根线安全吗

本文关键字:安全 lt 列表 array 操作 gt | 更新日期: 2023-09-27 18:24:13

如果我有一个包含4个long[]的列表,是否可以为每个long[]分配一个线程并对其进行修改?从技术上讲,没有线程试图修改另一个线程应该访问的数据。

long[] array1 = new long[4]{1,2,3,4};
long[] array2 = new long[4]{2,4,5,6};
long[] array3 = new long[4]{3,4,8,9};
long[] array4 = new long[4]{4,5,8,10};
List<long[]> myList = new List<long[]>();
myList.Add(array1);
myList.Add(array2);
myList.Add(array3);
myList.Add(array4);

然后使用任务工厂,让线程1将array1中的每个元素乘以1。线程2将线程2中的每个元素乘以2等。因此,最终的配置将是

1,2,3,4
4,8,10,12
9,12,24,27
16,20,32,40

操作列表<;array[]>;,这根线安全吗

数组可以由多个线程访问,前提是您不试图从两个线程访问数组的相同元素

List<T>在内部只是封装一个数组,所以从List<T>读取元素也可以。(注意:添加到列表不是线程安全的,因为这可能需要调整内部数组的大小。)

这意味着您的代码应该可以正常工作,因为您只是从List<T>中读取并写入数组。

你的代码可以很容易地写成:

Parallel.For(0, myList.Count, i =>
{
    long[] values = myList[i];
    for (int j=0;j<values.Length;++j)
       values[j] *= i + 1;
});

注意,由于您的第一次"循环"迭代只是将值* 1相乘,因此可以从1:开始跳过它

Parallel.For(1, myList.Count, i =>
{
    long[] values = myList[i];
    for (int j=0;j<values.Length;++j)
       values[j] *= i + 1;
});

您使用的结构本质上不是线程安全的,但由于每个数组只有一个线程,因此您定义的进程使用这些结构是安全的。

您可以使用线程安全的Blocking Collection。http://msdn.microsoft.com/en-us/library/dd997371.aspx