2

If i had a list containing 4 long[], is it possible to assign a thread to each long[] and modify it? No thread is technically trying to modify data another thread should be accessing.

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

Then using task factory, get thread 1 to multiply each element in array1 by 1. Thread 2 multiplies each element in thread 2 by 2, etc. So the final config would be

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

3 回答 3

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

请注意,由于您的第一个“循环”迭代只是将 values 相乘* 1,因此可以从 1 开始跳过它:

Parallel.For(1, myList.Count, i =>
{
    long[] values = myList[i];
    for (int j=0;j<values.Length;++j)
       values[j] *= i + 1;
});
于 2013-07-22T18:37:42.190 回答
0

您使用的结构本质上不是线程安全的,但是您定义的过程可以安全地使用这些结构,因为您通过每个数组只有一个线程来解决限制。

于 2013-07-22T18:40:19.483 回答
-1

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

于 2013-07-22T18:44:20.020 回答