كيف يولد مخطط تسمية تخزين آلية تخزين محمول محمول المعرفات النسبية الفريدة؟
سؤال
أ محمول موضوع تخزين محدد المرجع/الهوية آلية ، والتي تعزز/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_ptr
ctor ، أو دمرها 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 لاسترداد بيانات الكائن. يستخدم واجهة برمجة تطبيقات الخيوط المحددة معرف مؤشر الترابط (سياق محدد وحل بواسطة المكتبة نفسها) ومعرف الكائن لإرجاع الكائن الخاص إلى سياق مؤشر ترابط معين.