操作列表<array []>,这个线程安全吗?</array []>

时间:2013-07-22 18:35:15

标签: c# c#-4.0 task-parallel-library

如果我有一个包含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

3 个答案:

答案 0 :(得分:6)

如果您没有尝试从两个线程访问相同的数组元素,则可以通过多个线程访问数组。

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;
});

答案 1 :(得分:0)

您正在使用的结构本质上不是线程安全的,但是您定义的过程对于这些结构是安全的,因为您是通过每个阵列只有一个线程来解决这些限制。

答案 2 :(得分:-1)

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