سؤال

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

thread1()
{
    foo* p = get_pointer();
    ...
    p->do_something();
}

thread2()
{
    foo* p = get_pointer();
    ...
    delete p;
}

لذلك يمكن لـ Thread2 حذف المؤشر أثناء استخدام Thread1 له.مقرف.

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

std::vector<boost::shared_ptr<foo> > my_vec;

thread1()
{
    boost::shared_ptr<foo> sp = get_ptr[0];
    ...
    sp->do_something();
}

thread2()
{
    boost::shared_ptr<foo> sp = get_ptr[0];
    ...
    my_vec.erase(my_vec.begin());
}

boost::shared_ptr<foo> get_ptr(int index)
{
    lock_my_vec();
    return my_vec[index];
}

في المثال أعلاه، إذا حصل مؤشر الترابط 1 على المؤشر قبل مسح استدعاءات مؤشر الترابط 2، فهل سيظل الكائن المشار إليه صالحًا؟لن يتم حذفه فعليًا عند اكتمال مؤشر الترابط 1؟ لاحظ أن الوصول إلى المتجه العالمي سيكون عبر قسم بالغ الأهمية.

أعتقد أن هذه هي الطريقة التي تعمل بها Share_ptrs ولكنني بحاجة للتأكد.

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

المحلول

من أجل سلامة خيوط Boost::shared_ptr يجب عليك التحقق هذا الرابط.ليس من المضمون أن تكون آمنًا، ولكنها تعمل على العديد من المنصات.تعديل std::vector ليس آمنًا AFAIK.

نصائح أخرى

في المثال أعلاه، إذا حصل مؤشر الترابط 1 على المؤشر قبل مسح استدعاءات مؤشر الترابط 2، فهل سيظل الكائن المشار إليه صالحًا؟لن يتم حذفه فعليًا عند اكتمال مؤشر الترابط 1؟

في المثال الخاص بك، إذا حصل Thread1 على المؤشر قبل Thread2، فسيتعين على Thread2 الانتظار في بداية الوظيفة (بسبب القفل).لذا، نعم، سيظل الكائن المشار إليه صالحًا.ومع ذلك، قد ترغب في التأكد من أن my_vec ليس فارغًا قبل الوصول إلى العنصر الأول الخاص به.

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

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