مشاركة عبر


مؤشر ترابط تجمع (C# و Visual Basic)

تصف المقاطع التالية الميزات وفئات التي يمكن إستخدامها ليزامن الوصول إلى الموارد في تطبيقات ذات مؤشرات الترابط المتعددة.

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

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

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

للحصول على معلومات أساسية حول البرمجة ذات مؤشرات الترابط ، راجع:

تأمين و كلمات أساسية SyncLock

lock (C#) و SyncLockيمكن إستخدام عبارات (Visual Basic) للتأكد من تشغيل حظر من تعليمات برمجية إلى الاكتمال دون مقاطعة بواسطة عمليات جزئية الأخرى. ويتم تحقيق ذلك بواسطة الحصول على تأمين استثنائي مشترك لكائن محدد لمدة حظر التعليمة البرمجية .

عبارة lockأو SyncLock تُعطى كائن كوسيطة, متبوعةً بكتل التعليمات برمجية التي يتم تنفيذها بواسطة مؤشر ترابط واحد فقط في المرة. فعلى سبيل المثال:

Public Class TestThreading
    Dim lockThis As New Object

    Public Sub Process()
        SyncLock lockThis
            ' Access thread-sensitive resources.
        End SyncLock
    End Sub
End Class
public class TestThreading
{
    private System.Object lockThis = new System.Object();

    public void Process()
    {

        lock (lockThis)
        {
            // Access thread-sensitive resources.
        }
    }

}

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

وبوجه عام، فإنه من الأفضل إلى تجنب التأمين على publicالنوع، أو مثيلات الكائن خارج عنصر تحكم من التطبيق. على سبيل المثال: يمكن أن تكون lock(this)مشكلة إذا كان المثيل يمكن الوصول إليه من العموم, لأنه قد قفل تعليمات برمجية خارج عنصر تحكم على كائن جيداً. هذا يمكن إنشاء مواقف حالة توقف تام حيث تكون اثنين أو أكثر من العمليات الجزئية تنتظر حتى يطرح المنتج نفس الكائن. القفل على نوع بيانات عامة مقابلة لكائن، يمكن أن يسبب مشاكل في نفس السبب. خاصة التأمين على سلاسل قيمة حرفية خطر, لأن السلال تعتبر خلال وقت تشغيل اللغة العامة (CLR). وهذا يعني أن هناك مثيل واحد من أي سلسلة المعطى قيمة حرفية البرنامج بالكامل ، يمثل كائن نفسه بالضبط الحرفي في الكل تشغيل مجالات التطبيق على الكل عمليات جزئية. ونتيجة لذلك، يوضع قفل على سلسلة مع نفس المحتويات في أي مكان في أقفال عملية التطبيق كل المثيلات هذه السلسلة في التطبيق. وكنتيجة لذلك، فإنه من الأفضل قفل عضو خاص أو محمي لا interned. توفر بعض الفئات أعضاء خصيصاً للقفل. يوفر النوعArray على سبيل المثال، SyncRoot. توفر العديد من أنواع المجموعات عضوSyncRoot.

لمزيد من المعلومات حول عبارات lock و SyncLock، راجع المواضيع التالية:

أجهزة العرض

مثل الكلمات الأساسية lockو SyncLock أجهزة العرض تمنع كتل تعليمات برمجية من التنفيذ المتزامن بواسطة عمليات جزئية المتعددة. يسمح الأسلوب Enter بمؤشر ترابط واحد فقط للمتابعة في العبارات التالية; و يتم حظر العمليات الجزئية الأخرى حتى يتم تنفيذ استدعاءات مؤشر ترابط Exit. هذا تماماً كما تستخدم الكلمة الأساسية lock. فعلى سبيل المثال:

SyncLock x
    DoSomething()
End SyncLock
lock (x)
{
    DoSomething();
}

هذا مكافئ ل:

Dim obj As Object = CType(x, Object)
System.Threading.Monitor.Enter(obj)
Try
    DoSomething()
Finally
    System.Threading.Monitor.Exit(obj)
End Try
System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
try
{
    DoSomething();
}
finally
{
    System.Threading.Monitor.Exit(obj);
}

بإستخدام lock(C)# أو الكلمة أساسية SyncLock (Visual Basic) يُفضل عادةً عبر بإستخدام الفئة Monitor مباشرةً، كلاهما لأن lockأو SyncLockهو أكثر إيجازاً ونظرًا لأن lockأو SyncLockالتأكد أن جهاز العرض الأساسي تم إصداره حتى ولو طرحت التعليمة البرمجية المحمية استثناءً. ويتم تحقيق ذلك بإستخدام الكلمة الأساسية finally التي تقوم بتنفيذ حظر تعليمات برمجية المقترنة الخاصة به بغض النظر عن ما إذا كان تم إلقاء استثناء.

أحداث المزامنة و مقابض الانتظار

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

هناك نوعان من أحداث المزامنة: AutoResetEvent وManualResetEvent وهي تختلف فقط في التغييرات AutoResetEventمن إشارية إلى غير إشارية تلقائياً في أي وقت تنشط مؤشر ترابط. وعلى العكس، ManualResetEventيسمح بأي عدد من عمليات جزئية تنشيطها حالته إشارية و فقط ستعود إلى unsignaled الالولاية عند به Resetاستدعاء الأسلوب.

يمكن إجراء عمليات جزئية إلى الانتظار على أحداث عن طريق استدعاء أحد الأساليب الانتظار مثل WaitOne، WaitAny, أو WaitAll. WaitHandle.WaitOne()تسبب مؤشر ترابط إلى الانتظار حتى يصبح الإشارة حدث واحدWaitHandle.WaitAny()يحظر مؤشر ترابط حتى تصبح الإشارة أو أكثر من الأحداث المشار إليه وWaitHandle.WaitAll()يحظر مؤشر الترابط حتى تصبح الكل الأحداث المشار إليها الإشارة. يصبح الحدث مشار اليه عندما يتم استدعاء الأسلوب Set.

في المثال التالي، مؤشر ترابط تم إنشاؤه ويتم تشغيله بواسطة Mainالدالة. مؤشرالترابط الجديد ينتظر حدث بإستخدام الأسلوب WaitOne. مؤشر الترابط مرحلياً حتى يصبح الإشارة الحدث بواسطة مؤشر ترابط الأساسي الذي يقوم بتنفيذ الدالةMain. حالما يصبح الحدث إشاري مسار تنفيذ مؤشر الترابط يعود. في هذه الحالة، لأن الحدث يُستخدم فقط لتنشيط مؤشر ترابط واحد , فيتم إستخدام إما الفئة AutoResetEventأو ManualResetEvent.

Imports System.Threading

Module Module1
    Dim autoEvent As AutoResetEvent

    Sub DoWork()
        Console.WriteLine("   worker thread started, now waiting on event...")
        autoEvent.WaitOne()
        Console.WriteLine("   worker thread reactivated, now exiting...")
    End Sub

    Sub Main()
        autoEvent = New AutoResetEvent(False)

        Console.WriteLine("main thread starting worker thread...")
        Dim t As New Thread(AddressOf DoWork)
        t.Start()

        Console.WriteLine("main thread sleeping for 1 second...")
        Thread.Sleep(1000)

        Console.WriteLine("main thread signaling worker thread...")
        autoEvent.Set()
    End Sub
End Module
using System;
using System.Threading;

class ThreadingExample
{
    static AutoResetEvent autoEvent;

    static void DoWork()
    {
        Console.WriteLine("   worker thread started, now waiting on event...");
        autoEvent.WaitOne();
        Console.WriteLine("   worker thread reactivated, now exiting...");
    }

    static void Main()
    {
        autoEvent = new AutoResetEvent(false);

        Console.WriteLine("main thread starting worker thread...");
        Thread t = new Thread(DoWork);
        t.Start();

        Console.WriteLine("main thread sleeping for 1 second...");
        Thread.Sleep(1000);

        Console.WriteLine("main thread signaling worker thread...");
        autoEvent.Set();
    }
}

كائن المزامنة

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

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

على الرغم من أنه يمكنك إستخدام كائن المزامنة للمزامنة مؤشر ترابط العمليات الداخلي بإستخدام Monitorلأنه بشكل عام مفضل على أجهزة العرض التي يتم تصميمها خصيصاً .NET Framework وقم بإجراء وبالتالي أفضل إستخدام للموارد. في تباين الفئة Mutexبرنامج تضمين لبناء Win32. بينما هي أكثر فعالية من جهاز العرض ،يتطلب كائن المزامنة انتقالات التوافق التي تكون حسابيا أكثر تكلفة من تلك المطلوبة من قبل فئة Monitor راجع كائنات المزامنةللحصول على مثال التنفيذ.

فئة interlocked

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

أقفال ReaderWriter

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

deadlocks

تعد مزامنة مؤشر الترابط invaluable في تطبيقات ذات مؤشرات ترابط متعددة ولكن هناك دائماً خطر من إنشاء deadlock, حيث تنتظر العمليات الجزئية المتعددة بعضها الأخرى حتى يتم إيقاف التطبيق. تمثل حالة التوقف التام موقف حيث توقف السيارات في أربع طرق حيث كل شخص ينتظر الآخر لينتقل. تجنب حالات التوقف التام يعتبر مهم ; المفتاح هو التخطيط الدقيق. يمكن غالباً التنبؤ بمواقف حالة التوقف التام بواسطة التخطيط تطبيقات ذات مؤشرات الترابط المتعددة قبل البدء في كتابة التعليمات البرمجية.

الأقسام ذات الصلة

كيفية القيام بما يلي: استخدم تجمع مؤشر ترابط (C# و Visual Basic)

راجع أيضًا:

المرجع

بيان SyncLock

تأمين بيان (C# مرجع)

Thread

WaitOne

WaitAny

WaitAll

Join

Start

Sleep

Monitor

Mutex

AutoResetEvent

ManualResetEvent

Interlocked

WaitHandle

EventWaitHandle

System.Threading

Set

المبادئ

تطبيقات ذات مؤشرات ترابط (C# و Visual Basic)

كائنات المزامنة

أجهزة العرض

عمليات interlocked

AutoResetEvent

مزامنة البيانات الخاصة Multithreading

موارد أخرى

تطبيق طراز برمجة CLR الغير المتزامن

APM مبسط مع #C

مراقبة حالة توقف تام

multithreading في المكونات

كيفية: يزامن الوصول إلى مورد مشترك في بيئة متعدد العمليات بإستخدام ‏‫#Visual C .NET