كاتب الموضوع الآمن C ++ الأمراض المنقولة جنسيا :: مجموعة التي تدعم إضافة وإزالة والمكررات من المواضيع متعددة

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

سؤال

وأنا أبحث عن شيء مماثل لCopyOnWriteSet في جاوة، مجموعة التي تدعم add، remove ونوع من iterators من المواضيع متعددة.

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

المحلول

وليس هناك واحد أعرفه، والأقرب هو في اللبنات موضوع الذي concurrent_unordered_map

والحاويات STL تسمح الوصول للقراءة المتزامنة من المواضيع متعددة طالما أنك لا لا تفعل تعديل المتزامنة. في كثير من الأحيان أنه ليس من الضروري تكرار مع إضافة / إزالة.

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

وأعمل على مكتبة نمط موازية لذلك أنا أستخدم critical_section من VS2010 دفعة بيتا :: مزامنة يعمل كبيرة جدا ونمط RAII من استخدام lock_guard ضروري تقريبا بغض النظر عن كيف اخترت القيام بذلك:

template <class T>
class synchronized_set
{
    //boost::mutex is good here too
    critical_section cs;
public:
    typedef set<T> std_set_type;
    set<T> unsafe_set;
    bool try_insert(...)
    {
        //boost has a lock_guard
        lock_guard<critical_section> guard(cs);
    }
};

نصائح أخرى

لماذا لا مجرد استخدام مزامنة المشتركة لحماية الوصول المتزامن؟ تأكد من استخدام RAII لقفل وفتح مزامنة:

{
   Mutex::Lock lock(mutex);
   // std::set manipulation goes here
}

وحيث المزامنة :: قفل هي فئة ان اقفال مزامنة في منشئ ويفتح عليه في المدمر، ومزامنة هو كائن كائن مزامنة التي يتم مشاركتها من قبل جميع المواضيع. مزامنة هو مجرد فئة المجمع الذي يخفي أيا كان نظام التشغيل البدائي الذي تستخدمه. المحددة

ولقد اعتقدت دائما أن التزامن وتحديد السلوك والمفاهيم المتعامدة، لذلك فمن الأفضل أن يكون لهم في فصول منفصلة. في تجربتي، الفئات التي تحاول أن تكون موضوع آمنة حد ذاتها ليست مرنة جدا أو كل ما فائدة.

وكنت لا تريد قفل الداخلي، والثوابت الخاصة بك وسوف غالبا ما تتطلب عمليات متعددة على بنية البيانات، وتأمين الداخلي يمنع فقط الخطوات يحدث في نفس الوقت، في حين تحتاج إلى الحفاظ على الخطوات من مختلف عمليات الكلي من التداخل.

ويمكنك أيضا أن تأخذ نظرة على مكتبة ACE الذي لديه كل حاويات آمنة موضوع قد تحتاج من أي وقت مضى.

وكل ما يمكن ان يخطر لاستخدام قانون الزواج لالموازاة، تستمد فئة مجموعة من الأمراض المنقولة جنسيا ووضع قذيفة حول كل عملية مجموعة critial أن تعلن أن عملية حاسمة باستخدام #pragma المرصد المغربي للسجون حرجة.

والطبقة QSet كيو تي يستخدم تقاسم ضمني (نسخ على دلالات الكتابة) وأساليب مماثلة مع الأمراض المنقولة جنسيا :: مجموعة، يمكنك أن تبحث تنفيذه، كيو تي هو LGPL.

وسلامة الموضوع ونسخ على دلالات الكتابة ليست هي الشيء نفسه. أن يقال ...

إذا كنت حقا بعد دلالات النسخ عند الكتابة المكتبات أدوبي المصدر ديه copy_on_write القالب الذي يضيف هذه دلالات على كل ما مثيل معها.

scroll top