Han*_*del 2 c# task-parallel-library c#-4.0
如果我有一个包含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);
Run Code Online (Sandbox Code Playgroud)
然后使用任务工厂,获取线程1将array1中的每个元素乘以1.线程2将线程2中的每个元素乘以2,等等.所以最终的配置将是
1,2,3,4
4,8,10,12
9,12,24,27
16,20,32,40
Run Code Online (Sandbox Code Playgroud)
如果您没有尝试从两个线程访问数组的相同元素,则可以通过多个线程访问数组.
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;
});
Run Code Online (Sandbox Code Playgroud)
请注意,由于您的第一个"循环"迭代只是将值相乘* 1,因此可以从1开始跳过它:
Parallel.For(1, myList.Count, i =>
{
long[] values = myList[i];
for (int j=0;j<values.Length;++j)
values[j] *= i + 1;
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
183 次 |
| 最近记录: |