سؤال

لا أحد يعرف أين يمكنني العثور على implimentation أن يلف std::map ويجعل الموضوع في أمان ؟ عندما أقول موضوع آمنة أعني أنه لا يقدم سوى المسلسل الوصول إلى الخريطة ، موضوع واحد في وقت واحد.على النحو الأمثل ، هذه الخريطة يجب أن تستخدم فقط القياسية-المكتبة و / أو تعزيز بنيات.

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

المحلول

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

نصائح أخرى

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

ودفعة shared_mutex من شأنه أن يوفر أفضل قارئ متعددة / نهج الكاتب وحيد لالتفاف خريطة القياسية نظرا القيود الخاصة بك. أنا لا أعرف من أي تطبيقات "بنيت قبل" أن الزواج هذين منذ مهمة تافهة عموما.

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

في محاولة لجعل مؤشر الترابط-الآمن حاويات كان خطأ في جاوة ، وسيكون خطأ في C++.

وهذه محاولة مكتبة

http://www.codeproject.com/KB/threads/lwsync.aspx

ويتم تنفيذ ذلك في ج الحديثة ++ النهج القائم على السياسة.

وهنا بعض قطع من الارتباط لعرض الفكرة مع حالة 'ناقلات'

typedef lwsync::critical_resource<std::vector<int> > sync_vector_t;
sync_vector_t vec;

// some thread:
{
   // Critical resource can be naturally used with STL containers.
   sync_vector_t::const_accessor vec_access = vec.const_access();
   for(std::vector<int>::const_iterator where = vec_access->begin();
         where != vec_access->end();
         ++where;
        )
   std::cout << *where << std::endl;
}

sync_vector_t::accessor some_vector_action()
{
   sync_vector_t::accessor vec_access = vec.access();
   vec_access->push_back(10);
   return vec_access;
   // Access is escalated from within a some_vector_action() scope
   // So that one can make some other action with vector before it becomes
   // unlocked.
}

{
   sync_vector_t::accessor vec_access = some_vector_action();
   vec_access->push_back(20);
   // Elements 10 and 20 will be placed in vector sequentially.
   // Any other action with vector cannot be processed between those two
   // push_back's.
}

وخطرت لي هذه (التي أنا متأكد يمكن تحسينها لتأخذ أكثر من حجتين):

template<class T1, class T2>
class combine : public T1, public T2
{
public:

    /// We always need a virtual destructor.
    virtual ~combine() { }
};

وهذا يسمح لك أن تفعل:

// Combine an std::mutex and std::map<std::string, std::string> into
// a single instance.
combine<std::mutex, std::map<std::string, std::string>> lockableMap;

// Lock the map within scope to modify the map in a thread-safe way.
{
    // Lock the map.
    std::lock_guard<std::mutex> locked(lockableMap);

    // Modify the map.
    lockableMap["Person 1"] = "Jack";
    lockableMap["Person 2"] = "Jill";
}

إذا كنت ترغب في استخدام الأمراض المنقولة جنسيا :: recursive_mutex والأمراض المنقولة جنسيا :: مجموعة، والتي من شأنها أن تعمل أيضا.

وهناك اقتراح هنا (من قبلي - المكونات وقح) التي يلتف الكائنات (بما في ذلك الحاويات STL) للكفاءة (صفر التكلفة) موضوع الوصول الآمن:

https://github.com/isocpp/CppCoreGuidelines/issues/924

<اقتباس فقرة>   

والفكرة الأساسية هي في غاية البساطة. هناك فقط عدد قليل من فئات المجمع المستخدمة لفرض القراءة / الكتابة تأمين و، في نفس الوقت، وتقديم إما CONST (للقراءة فقط) عرض أو عدم CONST (للقراءة والكتابة) الكائن ملفوفة.

     

والفكرة هي لجعله تجميع الوقت من المستحيل للوصول بشكل غير صحيح تقاسم الموارد بين المواضيع.

ويمكن العثور على رمز تنفيذ هنا:

https://github.com/galik/GSL / فقاعة / قابلة للقفل الأجسام / وتشمل / GSL / gsl_lockable

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