並列プログラミング連動型C#

私はこの例と混同しています

http://msdn.microsoft.com/en-us/library/dd997393.aspx

Parallel.ForEach(nums,//source collection
                                   () => 0,//method to initialize the local variable
                                    (j, loop, subtotal) => 
                                    {
                                        subtotal += nums[j]; 
                                        return subtotal; 
                                    },

                                    (finalResult) => Interlocked.Add(ref total,finalResult)                                        );

I dont know why the last delegate (finalResult) =>
Interlocked.Add(ref total,finalResult)
requires an
Interlock, whereas the previous expression

(j, loop, subtotal) => 
                                    {
                                        subtotal += nums[j]; 
                                        return subtotal; 
                                    },

ではない?

ありがとう

ベストアンサー

Parallel.For()および
Parallel.ForEach()メソッドは、パーティショナを使用します。
10,000個の個別のタスクで10,000要素以上のループを実行することは非常に非効率的です。パーティショナーはデータを複数のセグメントに分割し、理想的には4コアCPUの2,500要素の4つのタスク(スレッド)で<�コード>
ForEach()を実行します。これには、ヒューリスティックが必要な場合があり、独自のカスタムパーティションを作成することができます。

When using the ‘normal’ (simple) overloads of
ForEach() this is fully transparent. But your example
uses one of the overloads that surfaces the partitioning.

subtotal + = nums [j];
ステートメントは1つのパーティション内で反復されるため、スレッドセーフです。

And (finalResult) => Interlocked.Add(ref
total,finalResult)
is where the partitions are merged, this
part is of course not thread-safe.

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です