C# 操纵列表<;数组[]>;,这个线安全吗?

C# 操纵列表<;数组[]>;,这个线安全吗?,c#,c#-4.0,task-parallel-library,C#,C# 4.0,Task Parallel Library,如果我有一个包含4个长[]的列表,是否可以为每个长[]分配一个线程并对其进行修改?从技术上讲,没有线程试图修改其他线程应该访问的数据 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 = n

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

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

阵列可以由多个线程访问,前提是您不尝试从两个线程访问阵列的同一元素

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

这意味着您的代码应该可以正常工作,因为您只需要从
列表中读取
,然后写入数组

您的代码可以轻松编写为:

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

您使用的结构本身并不是线程安全的,但是您定义的进程在处理这些结构时是安全的,因为您通过每个数组只有一个线程来克服这些限制

您可以使用线程安全的阻塞集合。

他们也可以使用
并行。Foreach(…)
@Douglas不,应该是
(0
-这是包含在内的。请参阅:@Tyler ForEach在这种情况下会困难得多,因为OP需要索引来执行数学运算。
For
由于所需的逻辑更合适。@ReedCopsey啊,是的,我错过了我不好的部分。@ReedCopsey:我的意思是:
值[j]*=(I+1);
。OP希望第一个数组乘以
1
,而不是
0
。没有“固有线程安全结构”这样的东西,线程安全是特定程序(或其一部分)的属性,而不是结构。例如,你可以以非线程安全的方式使用
ConcurrentDictionary
,也可以以线程安全的方式使用简单数组。也许我们对结构有不同的定义,或者说本质上是线程安全的。在我看来,结构只是一个具有方法和数据的对象。obje说CT的设计可以使用线程安全的方法来操作它的数据(毕竟它们只是程序的一小部分)。我会认为这个对象天生就是线程安全的,因为你可以根据它的设计安全地使用它(显然是在它自己实例的读取/分配之外)。我的观点是,即使结构的每一个操作都是线程安全的,它也不会神奇地使任何使用它的代码都是线程安全的。请考虑这样的代码:<代码>(Dig.CaseSKey(key))DICT[KIM]=1;否则DICT[密钥]++
。此代码不是线程安全的,无论
dict
是正常的
字典还是
ConcurrentDictionary
(根据您的说法,这应该是“固有的线程安全的”)是的,我们清楚地讨论了线程安全性的不同。我认为大多数人都会考虑<代码>互锁。增量<代码>是一个线程安全的函数。但是可以用线程安全的方式来使用它。任何东西都是这样。但是我认为函数本身是线程安全的。的确,它只包括那些本质上是线程安全的函数类型。
List
然而,它在任何方面都不是设计为线程安全的。两者之间有一个显著的区别,“本质上的线程安全”是我选择的表达方式。在这里使用
BlockingCollection
都没有任何帮助。
Parallel.For(0, myList.Count, i =>
{
    long[] values = myList[i];
    for (int j=0;j<values.Length;++j)
       values[j] *= i + 1;
});
Parallel.For(1, myList.Count, i =>
{
    long[] values = myList[i];
    for (int j=0;j<values.Length;++j)
       values[j] *= i + 1;
});