كيف يولد مخطط تسمية تخزين آلية تخزين محمول محمول المعرفات النسبية الفريدة؟

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

سؤال

أ محمول موضوع تخزين محدد المرجع/الهوية آلية ، والتي تعزز/thread/tss.hpp منها ، تحتاج إلى طريقة لإنشاء مفاتيح فريدة لنفسها. هذا المفتاح فريد من نوعه في نطاق الخيط ، ويستخدم لاحقًا لاسترداد الكائن الذي يشير إليه. يتم استخدام هذه الآلية في الكود المكتوب بطريقة محايدة مؤشر ترابط.

نظرًا لأن Boost هو مثال محمول لهذا المفهوم ، فما مدى عمل هذه الآلية على وجه التحديد؟

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

المحلول

يعد Boost Thread محمولًا لمكتبة ترابط PTHREAD (لـ UNIX) و Windows Win32 منخفض المستوى. تتيح المكتبة إنشاء مرجع وهو فريد من نوعه في كل مؤشر ترابط التنفيذ. واجهة برمجة تطبيقات C العالمية errno هو قدم كمثال من هذا المفهوم في وثائق Boost.


تجاهل ما إذا كنت تريد - إنه مجرد أثر من خلال الكود المصدري الذي يجد وظيفة الاهتمام

يبدأ جوهر هذه المسألة [boost]/boost/thread/tss.hpp مع ال get وظيفة thread_specific_ptr و ال reset الوظيفة - أي ، AQUISITION وتدمير ، على التوالي ، من الكائن المشار إليه. ملاحظة: لم يتم وضع كائن البيانات في مرجع thread_specific_ptrctor ، أو دمرها dtor. استدعاء وظيفة GET وإعادة ضبط set_tss_data و get_tss_data. التركيز فقط على جانب إعداد الوظيفة ، دعوة الوظيفة المهمة ، get_current_thread_data, ، غير مباشر عبر ملف CPP [boost]/libs/thread/src/[libname]/thread.cpp عبر سلسلة من المكالمات الوظائف. في get_current_thread_data هناك مكالمة وظيفة create_current_thread_tls_key وهذه هي الوظيفة التي ستنشئ معرفًا فريدًا لـ thread_specific_ptr هدف.


create_current_thread_tls_key المكالمات TlsAlloc() على Win32 (حلقة الوصل) و pthread_key_create ل PTHREAD (حلقة الوصل). تؤكد هذه المكالمات أنه عند تهيئة PTR ، يتلقى PTR معرفًا فريدًا قابلاً للاستخدام بطريقة محددة API لاسترداد بيانات الكائن. يستخدم واجهة برمجة تطبيقات الخيوط المحددة معرف مؤشر الترابط (سياق محدد وحل بواسطة المكتبة نفسها) ومعرف الكائن لإرجاع الكائن الخاص إلى سياق مؤشر ترابط معين.

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