سؤال

بدءًا من pthreads، لا أستطيع أن أفهم ما هو العمل مع pthread_key_t وpthread_once_t؟

هل من الممكن أن يشرح أحدكم بعبارات بسيطة مع الأمثلة، إن أمكن؟

شكرًا

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

المحلول

لا، لا يمكن تفسير ذلك بعبارات عامة.لا يستطيع الأشخاص العاديون البرمجة بنجاح باستخدام pthreads في لغة C++.يتطلب الأمر متخصصًا يُعرف باسم "مبرمج الكمبيوتر" :-)

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

pthread_key_t يشبه فهرس الوصول إلى التخزين المحلي لمؤشر الترابط.يمكنك التفكير في كل موضوع على أنه يحتوي على خريطة من المفاتيح إلى القيم.عند إضافة إدخال جديد إلى TLS، pthread_key_create يختار مفتاحًا له ويكتب هذا المفتاح في الموقع الذي تحدده.يمكنك بعد ذلك استخدام هذا المفتاح من أي مؤشر ترابط، عندما تريد تعيين أو استرداد قيمة عنصر TLS لمؤشر الترابط الحالي.السبب الذي يجعل TLS يمنحك مفتاحًا بدلاً من السماح لك باختيار واحد، هو أن المكتبات غير ذات الصلة يمكنها استخدام TLS، دون الحاجة إلى التعاون لتجنب استخدام نفس القيمة وإتلاف بيانات TLS الخاصة ببعضها البعض.قد تحتفظ مكتبة pthread على سبيل المثال بعداد عام، وتقوم بتعيين المفتاح 0 لأول مرة pthread_key_create ويسمى 1 للثانية، وهكذا.

نصائح أخرى

وpthread_key_t هو لخلق موضوع الخيط المحلي السعة التخزينية : كل موضوع يحصل على نسخته متغير البيانات، بدلا من كل المواضيع تقاسم (، من الدرجة ثابتة أو وظيفة ثابتة) متغير عمومي. تتم فهرسة TLS بواسطة مفتاح. انظر pthread_getspecific آخرون لمزيد من التفاصيل.

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

ونجاح باهر، وإجابات أخرى هنا هي وسيلة مطول جدا.

تنص

وpthread_once_t مخازن للpthread_once(). داعيا pthread_once(&s, fn) يدعو fn ويضع أشارت القيمة من قبل s لتسجيل الواقع تم تنفيذه. جميع المكالمات اللاحقة إلى pthread_once() هي noops. يجب أن يصبح اسم واضح الآن.

يجب تهيئة pthread_once_t إلى PTHREAD_ONCE_INIT.

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