قائمة دلفي أنواع البيانات مع مؤشر الترابط-الآمن' قراءة/كتابة العمليات ؟

StackOverflow https://stackoverflow.com/questions/510031

  •  21-08-2019
  •  | 
  •  

سؤال

هي "منطقية" المتغيرات مؤشر الترابط-الآمن للقراءة و الكتابة عن أي موضوع ؟ لقد رأيت بعض الأخبار المراجع أن تقول ذلك.أي أنواع البيانات الأخرى المتاحة ؟ (الأنواع السردية القصيرة رجات ربما؟)

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

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

المحلول

يرجى ملاحظة أنه يمكنك جعل أساسا كل شيء في دلفي unthreadsafe.بينما ذكر مشاكل المحاذاة على منطقية ذلك بطريقة يخفي المشكلة الحقيقية.

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

if NumberUpdated then
begin
  LocalNumber = TheNumber;
end;

بسبب التحسينات المعالج يجعل عدد يمكن قراءتها من قبل NumberUpdated قراءة ، وبالتالي قد تحصل على القيمة القديمة من عدد إفنثوو لكم تحديث NumberUpdated الماضي.

الملقب التعليمات البرمجية قد تصبح:

temp = TheNumber;
if NumberUpdated the
begin
  LocalNumber = temp;
end;

Imho ، القاعدة أساسية:
"ما هي الخيط آمنة.ويكتب ليست موضوع آمنة".
حتى إذا كنت تنوي القيام به الكتابة حماية البيانات مع تزامن في كل مكان يمكنك قراءة قيمة في حين أن الكتابة يمكن أن يحتمل أن تكون تحدث.
من ناحية أخرى, إذا كنت فقط قراءة و كتابة القيمة في موضوع واحد ، ثم إنه موضوع آمنة.لذلك يمكنك أن تفعل قطعة كبيرة من الكتابة في موقع مؤقت ، ثم مزامنة تحديث applicationwide البيانات.

مكافأة دعاية:

VCL ليس موضوع آمنة.الحفاظ على كل تعديل واجهة المستخدم الاشياء في الموضوع الرئيسي.الحفاظ على تهيئة كافة واجهة المستخدم الاشياء في الموضوع الرئيسي أيضا.

العديد من الوظائف ليست موضوع آمنة سواء, بينما البعض الآخر ، فإنه غالبا ما يعتمد على الأساسية winapi المكالمات.

لا أعتقد أن "قائمة" من شأنه أن يكون مفيدا مثل "الخيط آمنة" يمكن أن تعني الكثير من الأشياء.

نصائح أخرى

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

وهناك عدد من الوظائف التي تسمح لعمليات الذرية: زيادة متشابكة، إنقاص متشابكة، وتبادل متشابكة. هذا هو مفهوم شائع، لا شيء محدد لويندوز، إلى x86 أو دلفي. لدلفي يمكنك استخدام وظائف InterlockedFoo () من API ويندوز، وهناك العديد من أغلفة حول تلك أيضا. أو اكتب ما تريد. وظائف تعمل على الأعداد الصحيحة، لذلك يمكن أن يكون الذري الزيادة، إنقاص وتبادل الأعداد الصحيحة (32 بت) معهم.

ويمكنك أيضا استخدام المجمع وبادئة مكتب خدمات المشاريع مع البادئة القفل.

لمزيد من المعلومات راجع أيضا هذا السؤال ستاكوفيرفلوو .

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

ومع RISC المعالجات متعددة النواة والذاكرة المؤقتة الأساسية منفصلة يجري في مزيج من معالج الحديث، فليس من-يعد كذلك أن أي لغة 'تافهة' رفيع المستوى القراءة والكتابة بناء (أو بالنسبة لهذا الأمر العديد من مرة واحدة -upon واحد في الوقت 8086 "الذري" تعليمات التجميع) يمكن اعتبار الذري. في الواقع، إلا إذا تم تصميم تعليمات المجمع خصيصا لتكون الذري، وربما هو لا الذري - وهذا يشمل معظم آليات ليقرأ الذاكرة. حتى عدد صحيح طويل قراءة على مستوى المجمع يمكن أن تتلف قبل الكتابة في وقت واحد من النواة آخر الذي يشترك في نفس الذاكرة واستخدام إجراءات تحديث ذاكرة التخزين المؤقت غير متزامن على مستوى RISC المعالج. تذكر أن على معالج تضم متعددة النوى RISC، حتى التجمع تعليمات لغة بشكل فعال مجرد تعليمات كود "على مستوى أعلى"! أنت لا تعرف أبدا حقا كيف يتم تنفيذها على مستوى بعض الشيء، وأنه قد لا يكون تماما ما هو متوقع إذا كنت تقرأ قديمة 8086 (أحادية النواة) دليل المجمع. لا يوفر Windows الأصلي نظام التشغيل الذرية متوافقة، والتي يستحسن استخدام هذه بدلا من إجراء أية افتراضات قاعدة حول عمليات نووية.

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

وقراءة صفحات MSDN على عمليات نووية. وAPI ويندوز السطوح هذه لك. أنها قد تبدو في بعض الأحيان عالي الكعب أو الخرقاء - لكنها دليل على المستقبل، وأنها ستعمل دائما تماما كما يقول على القصدير

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

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

إندي رمز يحتوي على بعض الذرية / موضوع آمنة أنواع البيانات في IdThreadSafe.تقييم الأداء:

  • TIdThreadSafeInteger
  • TIdThreadSafeBoolean
  • TIdThreadSafeString
  • TIdThreadSafeStringList وبعض أكثر ...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top