غير مؤمن مؤشر الترابط-الآمن الانتظار في C++?

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

  •  10-07-2019
  •  | 
  •  

سؤال

هل هناك مؤشر الترابط-الآمن, غير مؤمن انتظار الفصل في C++?

ربما السؤال الأساسي ولكن لم تفعل C++ لفترة طويلة...

تحرير: إزالة الاحتياجات الخاصة بلبنان.

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

المحلول

على افتراض الخاص بك وحدة المعالجة المركزية غرفة مزدوجة-مؤشر واسعة مقارنة و المبادلة (compxchg8b على 486 أو أعلى ، compxchg16b على معظم amd64 آلات [غير موجود على بعض النماذج في وقت مبكر من قبل شركة انتل])...هناك خوارزمية هنا.

تحديث:ليس من الصعب أن يترجم هذا إلى C++ إذا لم تكن خائفا من القيام قليلا من العمل.:P

هذه الخوارزمية يفترض "المؤشر مع الوسم" هيكل الذي يبدو مثل هذا:

// Be aware that copying this structure has to be done atomically...

template <class T>
struct pointer
{
   T *ptr;
   uintptr_t tag;
};

إذا كنت ترغب في التفاف التعليمات lock cmpxchg{8|16}b مع بعض مضمنة asm...

ثم ربما يمكنك كتابة قائمة الانتظار عقدة مثل هذا:

template <class T>
struct queue_node
{
    T value;
    pointer<queue_node<T> > next;
};

والباقي هو أكثر أو أقل النسخ الخوارزمية أنا مرتبطة...

نصائح أخرى

منذ الحالية C++ القياسية لا يعترف حتى بوجود المواضيع, هناك بالتأكيد شيء مؤشر الترابط-الآمن في المحكمة أو أي جزء آخر من المكتبة القياسية.

هذا يبدو أنه قد تم الشعبية الموضوع على الدكتورDobb آخر السنة:

تحتاج إلى تنفيذ ذلك بنفسك أو استخدام مكتبة تنفيذ ذلك.أن تفعل ذلك بنفسك ، قد ترغب في إلقاء نظرة على هذا:

تنفيذ مؤشر الترابط-الآمن قائمة الانتظار باستخدام متغيرات حالة

الجواب القصير - لا.المحكمة الخاصة بلبنان لا تشغل نفسها مع التزامن (على الأقل على مستوى المواصفات.) الحالية C++ القياسية لا يقول شيئا حول المواضيع.

يمكنك بسهولة بناء مثل هذا الانتظار على رأس المحكمة الخاصة بلبنان وتعزيز الرغم من ذلك - مجرد التفاف std::queue و boost::mutex في فئة مخصصة.

المحكمة الخاصة بلبنان الحاويات ليست مؤشر الترابط-الآمن ، يجب تنفيذ العلاج من أجل الوصول المتزامن.
هناك هذا المشروع (C++) التي تهدف إلى خدمة المتزامنة بالوصول : CPH الخاصة بلبنان ،
و ورقة عن.

قد يكون متأخرا جدا الآن.للرجوع إليها في المستقبل, هذا واحد هو جيد تنفيذ قفل خالية من طوابير (بنيت في موضوع السلامة مع بعض المحاذير).

موضوع منتج متعدد المستهلك

http://moodycamel.com/blog/2014/a-fast-general-purpose-lock-free-queue-for-c++

https://github.com/cameron314/concurrentqueue

واحد منتج - مستهلك واحد

http://moodycamel.com/blog/2013/a-fast-lock-free-queue-for-c++

https://github.com/cameron314/readerwriterqueue

حاليا غير رسمية دفعة.Lockfree هو شيء للنظر.يمكنني استخدام كل FIFO و الذرية أنواع.

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