نظرة عامة حول الأوليات المزامنة

إطار عمل.NET توفر من الأوليات المزامنة للتحكم في التفاعلات من عمليات جزئية و تجنب حالات السباق. هذه يمكن أن تكون تقريبا مقسمة في ثلاث فئات: التأمين، وإرسال إشارة، و interlocked العمليات.

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

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

تشتمل هذه النظرة العامة على الأقسام التالية:

  • الإقفال

  • إرسال إشارة

  • أنواع المزامنة خفيفة

  • SpinWait

  • العمليات interlocked

الإقفال

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

التأمين الحصري

أبسط نموذج للتأمين هو C# lockعبارة ( SyncLockفي Vهوual الأساسية)، التي تتحكم في الوصول إلى حظر من تعليمات برمجية. مثل حظر هو كثيرا ما يشار إلى مقطع حرج. lockعبارة هو تطبيق باستخدام Enterو Exitوظائف Monitorفئة، وهو يستخدم try…catch…finallyللتأكد من أن التأمين هو إصدارها.

بشكل عام، استخدام lockعبارة لحماية كتل صغيرة من تعليمات برمجية، لن تمتد إلى المزيد أسلوب واحد، هو أفضل طريقة لاستخدام Monitorفئة. على الرغم من فعالية، Monitorالفئة هو عرضه لعمليات التأمين معزولة deadlocks.

فئة جهاز العرض

Monitorتوفر الفئة وظائف إضافى، والذي يمكن استخدامه بالتزامن مع lockعبارة:

  • TryEnterأسلوب يسمح مؤشر ترابط الذي هو حظر انتظار المورد لإعطاء بعد الفاصل الزمني المحدد. تقوم بإرجاع القيمة منطقية تشير إلى نجاح أو فشل، والتي يمكن استخدامها للكشف عن و تجنب deadlocks المحتملة.

  • Waitأسلوب هو استدعاؤها بواسطة مؤشر ترابط في مقطع حرج. وهي تعطي للتحكم بمورد وحظر حتى مورد هو متوفراً مرة أخرى.

  • Pulseو PulseAllوظائف يسمح مؤشر ترابط أنه على وشك تحرير التأمين أو للاتصال Waitلواحد أو أكثر من مؤشرات الترابط في وضع جاهز قائمة الانتظار، حيث أنها يمكن اكتساب تأمين.

مهلة تشغيل Waitالتحميلات الزائدة أسلوب يسمح بانتظار عمليات جزئية للهروب إلى قائمة انتظار جاهزة.

Monitorيمكن أن توفر فئة التأمين في عدة مجالات التطبيقات إذا كان الكائن المستخدم للتأمين مشتقة من MarshalByRefObject.

Monitorقام مؤشر ترابط. التي هو، يجب إنهاء مؤشر ترابط التي تم إدخالها على جهاز العرض بواسطة استدعاء Exitأو Wait.

Monitorالفئة هو غير instantiable. تكون لها وظائف ثابتة ( Sharedفي Visual أساسى)، و تشغيل تشغيل كائن قفل instantiable.

لنظره عامة أساسية، راجع أجهزة العرض.

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

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

بالإضافة إلى ذلك، Mutexمشتقة من WaitHandle، مما يعني أنه يمكن استخدامه مع آليات إرسال الإشارات يوفرها WaitHandle، مثل كـ WaitAll، WaitAny، و SignalAndWaitالأساليب.

مثل Monitor، Mutexعلى مؤشر ترابط. Monitor، بعكس Mutexهو على كائن instantiable.

لنظره عامة أساسية، راجع كائنات المزامنة.

فئة تأمين لوصول فردي

بدءاً من .NET Framework الإصدار 4، يمكنك استخدام SpinLockفئة عندما مقدار الحمل يطلبها Monitorينخفض الأداء. عند SpinLockمواجهة مقطع حرج قفل ed، يدور ببساطة في تكرار حلقي حتى قفل يصبح متوفراً. في حالة التأمين هو المستمر لفترة قصير جداً، يختفي يمكن أن يوفر أداء أفضل من حظر. ومع ذلك، إذا كان التأمين هو المستمر لالمزيد بضع tens من الدورات، SpinLockينفذ فقط أيضا ك Monitor، إلا أنه يستخدم دورات CPU أكثر من وبالتالي يمكن أن تخفض أداء غير ذلك عمليات جزئية أو معالجات.

غير ذلك التأمين

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

فئة ReaderWriterLock

ReaderWriterLockSlimفئة يعالج الحالة الموقع مؤشر ترابط أن تغييرات بيانات، والكاتب، يجب أن يكون حق وصول خاص إلى مورد. عند الكاتب هو غير نشط، أي عدد من القراء يمكنهم الوصول إلى مورد (على سبيل المثال، بواسطة استدعاء EnterReadLockالأسلوب). عند قيام مؤشر ترابط يطلب الوصول الحصري، (على سبيل المثال، بواسطة استدعاء EnterWriteLockأسلوب)، حظر الطلبات اللاحقة القارئ إلى أن يكون لكافة القراء موجود إنهاء التأمين، و قام الكاتب بإدخال و إنهاء التأمين.

ReaderWriterLockSlimقام مؤشر ترابط.

لنظره عامة أساسية، راجع الكاتب بقارئ التأمين.

فئة إشارة

Semaphoreفئة يسمح عدد معين من عمليات جزئية الوصول إلى مورد. تطلب حظر مورد حتى يتم تحرير مؤشر ترابط إشارة مؤشرات ترابط إضافى.

في Mutexفئة، Semaphoreمشتقة من WaitHandle. أيضا مثل Mutex، Semaphoreيمكن أن تكون محلية أو عمومي. ويمكن استخدامه عبر حدود مجال تطبيق.

Monitor، بخلاف Mutex، و ReaderWriterLock، Semaphoreلم يكن مؤشر ترابط. هذا يعني أنه يمكن استخدامه في وحدات سيناريو الموقع الاكتسابات مؤشر ترابط واحد في إشارة و آخر بتحرير.

لنظره عامة أساسية، راجع إشارة و SemaphoreSlim.

System.Threading.SemaphoreSlimهو إشارة خفيفة للتزامن داخل حدود عملية مفردة.

العودة إلى الأعلى

إرسال إشارة

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

توفر مقابض انتظار التعيين أغنى كثير من الانتظار وإرسال إشارة إمكانيات.

انتظر معالجات

مقابض انتظار ينحدر من WaitHandleفصل دراسي، والتي بدورها مشتقة من MarshalByRefObject. Thus, wait handles can be used إلى يزامن the activities of عمليات جزئية عبر مجال تطبيق boundaries.

عمليات جزئية حظر تشغيل wait handles بواسطة calling the مثيل أسلوب WaitOne أو واحد of the ثابت وظائف WaitAll, WaitAny, أو SignalAndWait. How they are released depends تشغيل which أسلوب was called, و تشغيل the نوع of wait handles.

لنظره عامة أساسية، راجع انتظر معالجات.

حدث Wait Handles

حدث wait handles تضمين the EventWaitHandle فئة و its derived فئات, AutoResetEvent و ManualResetEvent. عمليات جزئية are released من an حدث wait مؤشر when the حدث wait مؤشر هو signaled بواسطة calling its Set أسلوب أو بواسطة using the SignalAndWait أسلوب.

حدث wait handles either يعيد تعيين المعاملة themselves automatically, مثل a turnstile that allows فقط واحد مؤشر ترابط through each الوقت it هو signaled, أو must be يعيد تعيين المعاملة manually, مثل a gate that هو مغلق until signaled و then فتح until someone closes it. كـ their أسماء imply, AutoResetEvent و ManualResetEvent represent the former و latter, respectively. System.Threading.ManualResetEventSlimهو حدث خفيفة للتزامن داخل حدود عملية مفردة.

EventWaitHandleيمكن أن يمثل نوع حدث، أما و يمكن أن تكون محلية أو عمومي. الفئات المشتقة AutoResetEventو ManualResetEventدائماً المحلية.

ليس لديك مقابض انتظار حدث مؤشر ترابط. أي يمكن لمؤشر ترابط إشارة مؤشر انتظار حدث.

لنظره عامة أساسية، راجع EventWaitHandle AutoResetEvent، CountdownEvent و ManualResetEvent.

فئات و إشارة كائن المزامنة

لأن Mutexو Semaphoreاشتقاق الفئات من WaitHandle، يمكن استخدامها مع ثابت وظائف WaitHandle. على سبيل المثال، يمكن لمؤشر ترابط استخدام WaitAllأسلوب إلى بالانتظار حتى يتم الثلاث التالية صحيحاً: EventWaitHandleهو إليه بصوت، Mutexهو إصدارها، Semaphoreهو إصدارها. وبنفس الطريقة، استخدام مؤشر ترابط WaitAnyأسلوب الانتظار إلى حين أي من تلك الحالات هو صواب.

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

حاجز

Barrierفئة يوفر طريقة إلى cyclically مزامنة مؤشرات ترابط متعددة بحيث يتم حظر الجميع في نفس بالإشارة وتنتظر الجميع مؤشرات الترابط الأخرى إلى كاملة. حاجز هو مفيدة عندما تتطلب عمليات جزئية أو أكثر نتائج مؤشر ترابط آخر قبل المتابعة إلى المرحلة التالية من خوارزمية. لمزيد من المعلومات، راجع حاجز (إطار عمل.NET).

العودة إلى الأعلى

أنواع المزامنة خفيفة

بدءاً من .NET Framework 4، يمكنك استخدام الأوليات المزامنة التي توفر كائنات الأداء fكـt بتجنب كلفة اعتماد موردين في Win32 kernel مثل كـ انتظار معالجة كلما ممكن. بشكل عام، يجب عليك استخدام هذه الأنواع عندما تكون أوقات الانتظار القصير وفقط عندما أنواع المزامنة الأصلي تم تجربة والعثور على إلى أن unsatisfacإلىry. لا يمكن استخدام الأنواع الخفيفة في الحالات التي تتطلب الاتصال بين العمليات.

العودة إلى الأعلى

SpinWait

بدءاً من .NET Framework 4، يمكنك استخدام System.Threading.SpinWaitبناء عندما يكون مؤشر ترابط انتظار حدث إلى أن إليه صوت أو شرط أن تتحقق، ولكن عند وقت الانتظار الفعلية هو من المتوقع أن يكون أصغر من من وقت الانتظار المطلوب باستخدام مؤشر انتظار أو otherwهوe حظر مؤشر الترابط الحالي. باستخدام SpinWait، يمكنك تحديد فترة زمنية قصير إلى زيادة ونقصان أثناء انتظار، ومن ثم العائد (على سبيل المثال، بانتظار أو سكون) فقط إذا تم استيفاء الشرط ليس في الوقت المحدد.

العودة إلى الأعلى

العمليات interlocked

تعتبر العمليات interlocked بسيط بسيط العمليات تشغيل الموقع ذاكرة عن طريق ثابت أساليب Interlockedفئة. تضمين تلك العمليات بسيط بالإضافة إلى ذلك، تزايد و إنقاص تبادل الشرطي استناداً إلى مقارنة، وتبادل و قراءة عمليات للقيم من النوع 64 بت تشغيل الأنظمة الأساسية فئة 32 بت.

ملاحظةملاحظة

ضمان atomicity هو محدود للعمليات الفردية؛ عندما يجب إجراء عمليات متعددة كوحدة، mechanهوm تزامن coarse-grained أكثر يجب أن يستخدم.

وعلى الرغم من أنه لا يوجد أي من هذه العمليات بالتأمين أو إشارات، يمكن استخدامها إلى إنشاء إشارات والتأمين. لأنها أصلية إلى نظام تشغيل Windows، تكون العمليات interlocked سريعة جداً.

يمكن استخدام العمليات interlocked مع ذاكرة متنقلة ضمنية لكتابة التطبيقات التي يواجه قوة التزامن غير مؤمن. ومع ذلك، تتطلب البرمجة المعقدة، ذات المستوى المنخفض، حتى لمعظم الاستخدامات، يتم تأمين بسيطة اختياراً أفضل.

لنظره عامة أساسية، راجع العمليات interlocked.

العودة إلى الأعلى

راجع أيضًا:

المبادئ

مزامنة بيانات ل متعدد العمليات

أجهزة العرض

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

إشارة و SemaphoreSlim

انتظر معالجات

العمليات interlocked

الكاتب بقارئ التأمين

موارد أخرى

EventWaitHandle AutoResetEvent، CountdownEvent و ManualResetEvent

حاجز (إطار عمل.NET)

SpinWait

تأمين لوصول فردي