0

我尝试以这样的方式复制数组,我可以用线程处理数组中的数据,但显然没有将数组拆分成更小的块(比如说 1 个数组 -> 4 个四分之一(4 个数组))。

我可以从指定的(int)起点找到副本并从头到尾复制所有前导数据的唯一方法,如果我使用多个线程来处理数据,它会使线程点无效。

这是显示我想要做的伪代码。

int array { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }
int split1 { 0, 1, 2, 3 }
int split2 { 4, 5, 6, 7 }
int split3 { 8, 9, 10, 11 }
int split4 { 12, 13, 14, 15 }

或者让我们说数组的长度不能被平均分割

int array { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
int split1 { 0, 1, 2, 3 }
int split2 { 4, 5, 6, 7 }
int split3 { 8, 9, 10, 11 }
int split4 { 12, 13, 14, 15, 16}
4

1 回答 1

2

我可以从指定的(int)起点找到副本并从头到尾复制所有前导数据的唯一方法,如果我使用多个线程来处理数据,它会使线程点无效。

很遗憾你没有展示那是哪种方法。具有用于将数组的一部分复制到另一个数组的Array.Copy各种重载。可能是最有帮助的:

public static void Copy(
    Array sourceArray,
    int sourceIndex,
    Array destinationArray,
    int destinationIndex,
    int length
)

或者,看看Buffer.BlockCopy,它具有基本相同的签名 - 但值都是字节而不是数组索引。它也仅适用于基元数组。

另一种选择是根本不创建数组的副本——如果每个线程都知道它应该使用数组的哪个段,它可以直接访问它。您还应该研究Parallel.ForEach(和类似的方法)作为在更高级别轻松并行化操作的一种方式。

于 2012-12-23T13:29:59.613 回答