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