مشاركة عبر


كيفية القيام بما يلي: تكرار حلقي متوازى.For والتي يحتوي على جزء الترابط-محلي متغيرات الكتابة

Th هو مثال يوضح كيفية استخدام المتغيرات المحلية مؤشر ترابط لتخزين واسترداد الولاية في كل منفصلة المهام التي هو تم إنشاؤه بواسطة Forالحلقة. باستخدام مؤشر ترابط-محلي بيانات، يمكنك تجنب مقدار الحمل من مزامنة عددا كبيرا من الوصول إلى الحالة المشتركة. بدلاً من الكتابة إلى مورد مشترك تشغيل كل تكرار، فحساب و تخزين القيمة حتى يتم إكمال الجميع التكرارات للمهمة. يمكنك ثم كتابة النتيجة النهائية مرة واحدة إلى مورد مشترك أو تمريرها إلى أسلوب آخر.

مثال

'How to: Write a Parallel.For Loop That Has Thread-Local Variables

Imports System.Threading
Imports System.Threading.Tasks

Module ForWithThreadLocal

    Sub Main()
        Dim nums As Integer() = Enumerable.Range(0, 1000000).ToArray()
        Dim total As Long = 0

        ' Use type parameter to make subtotal a Long type. Function will overflow otherwise.
        Parallel.For(Of Long)(0, nums.Length, Function() 0, Function(j, [loop], subtotal)
                                                                subtotal += nums(j)
                                                                Return subtotal
                                                            End Function, Function(x) Interlocked.Add(total, x))

        Console.WriteLine("The total is {0}", total)
        Console.WriteLine("Press any key to exit")
        Console.ReadKey()
    End Sub

End Module
namespace ThreadLocalFor
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading;
    using System.Threading.Tasks;


    class Test
    {
        static void Main()
        {
            int[] nums = Enumerable.Range(0, 1000000).ToArray();
            long total = 0;

            // Use type parameter to make subtotal a long, not an int
            Parallel.For<long>(0, nums.Length, () => 0, (j, loop, subtotal) =>
            {
                subtotal += nums[j];
                return subtotal;
            },
                (x) => Interlocked.Add(ref total, x)
            );

            Console.WriteLine("The total is {0}", total);
            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
        }
    }
}

معلمات الأولى والثانية كل Forتحديد أسلوب البداية والنهاية تكرار قيم. في حالات التحميل هذا الأسلوب، كانت معلمة الثالث الموقع التهيئة الخاصة بك محلي الحالة. " تعني الولاية المحلي"في هذا سياق متغير مدة بقاء الذي يمتد من تماما قبل إلى التكرار أول من تكرار حلقي تشغيل مؤشر ترابط الحالي فقط بعد تكرار آخر.

نوع معلمة الثالث هو Func ` Func<TResult>الموقع TResult هو النوع متغير الذي يقوم بتخزين الولاية مؤشر ترابط المحلية. لاحظ أن في هذا المثال، الإصدار عام من الأسلوب الذي يتم استخدامه، و هو نوع معلمة طويلة . يخبرك معلمة نوع المحول البرمجي نوع المتغير المؤقت الذي سيتم استخدامه إلى sإلىre الولاية مؤشر ترابط المحلية. () => 0 ( Function() 0 ) التعبير في ترتيب هو يعني المثال المتغير المحلي مؤشر ترابط هو تهيئة إلى صفر. إذا كان نوع معلمة هو نوع مرجع أو نوع القيمة معرفة من قبل مستخدم، ثم Func هذه تبدو كما يلي:

() => new MyClass()
Function() new MyClass()

معلمة نوع الرابع هو الموقع تقوم بتعريف المعلومات المنطقية تكرار حلقي. يظهر Intellisense أنها تحتوي على نوع من Func<int, ParallelLoopState, long>أو Func(Of Integer, ParallelLoopState, Long). يتوقع التعبير لامدا معلمات لإدخال ثلاثة في ذلك نفس الطلب المتوافق مع إلى تلك الأنواع. أخير هو نوع معلمة نوع الإرجاع. في هذا حالة النوع طويل حيث يكون ذلك هو نوع قمنا بتحديدها في Forنوع معلمة. نقوم باستدعاء هذا المتغير subtotalفي تعبير lambda، وعد it. القيمة الإرجاع هو استخدامه ليهيّئ المجموع الفرعي في كل تكرار اللاحقة. يمكنك أيضا اعتبار th هو الأخير معلمة بساطة كالقيمة هو التي تم تمريرها إلى كل تكرار، ثم إلى localFinallyتفويض عند تكرار آخر هو كاملة.

معلمة الرابع هو الموقع تقوم بتعريف الطريقة التي سيتم تسمية مرة واحدة، بعد الجميع التكرارات تشغيل ترتيب هو إكمال مؤشر ترابط. يتوافق مع نوع معلمة إدخال مرة أخرى إلى معلمة نوع Forأسلوب النسخ الاحتياطي ونوع يتم إرجاعها بواسطة لامدا نص التعبير. في ترتيب هو سبيل المثال، القيمة هو تمت الإضافة إلى متغير في نطاق الفئة في مؤشر ترابط طريقة آمنة. بواسطة استخدام متغير مؤشر الترابط المحلية، فإننا قد تجنب الكتابة إلى هذا المتغير فئة في كل تكرار لكل مؤشر ترابط.

لمزيد من المعلومات حول كيفية إلى استخدام تعبيرات لامدا، راجع لامدا التعبيرات في PLINQ و TPL.

راجع أيضًا:

المبادئ

بيانات متوازى ism (مكتبة متوازى المهام)

البرمجة المتوازية في .NET Framework

مكتبة متوازى مهمة

لامدا التعبيرات في PLINQ و TPL