سؤال

هل هناك طريقة لجعل وظيفة الذرية في C.

أنا لا أبحث عن حل محمول.(منصات يبحث عن الفوز,لينكس)

هل كانت مفيدة؟

المحلول

ربما.

ذلك يعتمد كليا على تعريف "الذرية".

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

  • في RTOS (في الوقت الحقيقي نظام التشغيل) البيئة نواة نظام التشغيل عادة ما يوفر مستوى منخفض تزامن الأوليات مثل المقاطع الحرجة.الحرجة القسم هو كتلة من التعليمات البرمجية التي يتصرف "أساسا" الذرة ، على الأقل فيما يتعلق بجميع المقاطع الحرجة.وهي عادة ما تكون أساسية في نظام التشغيل تنفيذ مزامنة أخرى الأوليات.

  • في متعددة النواة بيئة منخفضة المستوى البدائي يسمى spinlock متوفرة في كثير من الأحيان.يتم استخدامه للوقاية من الدخول إلى كتلة من التعليمات البرمجية التي يجب أن تكون الذرية فيما يتعلق المستخدمين الآخرين من نفس spinlock كائن ، و يعمل عن طريق منع انتظار وحدة المعالجة المركزية الأساسية في حلقة ضيقة حتى يتم تحرير القفل (ومن هنا جاء الاسم).

  • في العديد من خيوط بيئات أكثر تعقيدا الأوليات مثل الأحداث, الإشارات, mutexes و طوابير يتم توفيرها من قبل خيوط الإطار.هذه التعاون مع موضوع جدولة مثل هذه المواضيع في انتظار أن يحدث شيء لا تعمل على الإطلاق حتى يتحقق الشرط.هذه يمكن استخدامها لجعل وظيفة إجراءات الذرية فيما يتعلق المواضيع الأخرى التي تتقاسم نفس التزامن الكائن.

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

نصائح أخرى

إذا كنت ترغب في التأكد من لن تنقطع وظيفة عن طريق الإشارة، واستخدام sigprocmask() لإخفاء وكشف الإشارات، على الرغم من بعض الإشارات لا يمكن أن يكون قد تم حظره (مثل SIGKILL) والسلوك لمنع بعض الإشارات (مثل SIGSEGV) هو غير معروف.

وانظر man sigprocmask لمزيد من التفاصيل.

وليس تنقليا، على الأقل. بالنسبة لبعض النظم، وربما يمكنك الاقتراب منه، عن طريق القيام بأشياء مثل تحول المقاطعات آلة، لمنع نواة من استباق وظيفة الخاص بك. ولكن سيكون من الصعب للغاية، وخاصة بالنسبة للأنظمة غير المضمنة.

وأنت بحاجة إلى دعم منصة محددة للقيام بذلك - إما عن طريق استخدام intrinsics مترجم خاص لتعليمات الأجهزة، أو باستخدام دعم نظام التشغيل. لا C ++ C ولا تمت موحدة الاشياء التزامن.

تحديد ماذا تعني بـ 'الذرية.' تعني الذرية' بمعنى أنه لا توجد عملية أخرى أو موضوع سيتم اختيار الجدولة عند تشغيل وظيفة ؟ أو هل يعني أن أي الكائنات المشتركة المشار إليها في وظيفة الخاص بك لن يتم تعديل أي المواضيع الأخرى في حين الخاص بك وظيفة تعمل ؟

السابق لا يمكن التحكم في ذلك من userspace.إذا كنت على واحدة وحدة المعالجة المركزية الجهاز يمكنك ربما ضمان atomicity من خلال رفع العملية الخاصة بك الأولوية الأولوية القصوى الممكنة (من userspace).ولكن حتى ذلك الحين انها ليست مضمونة لأن خوارزمية الجدولة الخاصة بك قد لا تزال تسمح عملية أخرى لتشغيل.الطريقة الوحيدة التي يعول عليها للقيام بذلك هي من نظام التشغيل.واحد-وحدة المعالجة المركزية آلة أنك تعطيل المقاطعات.متعدد آلة الأساسية سوف تحتاج إلى تأمين حافلة وانتظر جميع العمليات التي تعمل على وحدات المعالجة المركزية الأخرى إلى اتخاذ.

السؤال هنا هو: لماذا تريد ضمان atomicity? في عام ، ضرورة أن تقتصر العملية الخاصة بك قد تكون قيد التشغيل وليس غيرهم ، لا يجب أن توجد في userspace.إذا كنت ترغب في التأكد من بعض البيانات هياكل الوصول إليها فقط من خلال موضوع واحد في وقت واحد, ثم يجب عليك استخدام المحمولة موضوع المكتبة (مثل pthread على سبيل المثال) ، و السياج قبالة الخاص بك وظيفة مقطع حرج.

وإذا كان عن طريق الذري تقصد "فقط موضوع واحد في وقت واحد، ثم هل يمكن أن مجرد حماية وظيفة مع كتلة مقطع الهامة (في ويندوز). في لينكس، وأنا استخدم قفل مزامنة / فتح أكثر أو أقل محاكاة مقطع حرج.

وقد ترغب في النظر في الإشارات POSIX، كائنات المزامنة أو ما شابه ذلك، والتي قد تعمل على كل من ويندوز ولينكس.

وعلى سبيل المثال عن طريق سيغوين أو مينغو انها من الممكن حتى لكتابة رمز المحمولة بين لينكس وويندوز.

وحتى أفضل يمكنك إنشاء يبس ويندوز على لينكس: HTTP : //cdtdoug.blogspot.com/2009/05/mingw-cross-for-linux.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top