سؤال

لقد تعلمت للتو ذلك بلغة ج malloc تأتي الوظيفة مع مشكلة التنافس في مؤشر الترابط عند استخدامها في تطبيقات متعددة الخيوط.

في C ++ يفعل operator new تعاني من نفس المشكلة؟ إذا كانت الإجابة بنعم ، فما هي tecnhique التي يمكنني استخدامها لتجنب ذلك يبدو وكأنه عقوبة كبيرة في أداء التطبيق؟

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

المحلول

تعتمد "قضية" خلاف الخيط حقًا على التنفيذ. لم يتم تصميم بعض تطبيقات Malloc في الاستخدام الشائع في الأصل مع وضع MultiTreading في الاعتبار. لكن تنفيذ Malloc المصمم للتطبيقات المتعددة المتقدمة لا ينبغي أن يعاني من الخلاف في الظروف العادية.

كمثال على تطبيق Malloc المصمم مع وضع MultiTreading في الاعتبار ، انظر إلى Jemalloc.

نصائح أخرى

اعتمادًا على تطبيقات جديدة ولكن كما هو الحال عادةً في Malloc. هنا بعض الأشياء التي يمكنك القيام بها:

  • استخدم profiler لحساب عدد المكالمات إلى malloc() (و ربما brk()) في الثانية ، تأكد من أن لديك مشكلة خلاف معها malloc().
  • حاول العمل مع تخصيص ذاكرة متوازية (أي. اكتناز)
  • استخدم المكدس كلما كان ذلك ممكنًا: لا تتصل الجديدة عندما لا تحتاج إلى ذلك. تذكر أيضًا أن النسخ الصغيرة عادة ما تكون صديقة للذاكرة التخزين المؤقت أكثر من المؤشرات والبيانات المشتركة بين المواضيع.

في C ++ هل يعاني المشغل الجديد من نفس المشكلة؟

نعم ، في معظم التطبيقات ، يفعل ذلك.

إذا كنت في C ++ بالفعل ، خيوط لبنات البناء هي مكتبة قالب C ++ التي يجب أن تناسب احتياجاتك. لديها مخصصات قابلة للتطوير ، هياكل البيانات ، أ موقع الكتروني و اكثر...

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

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

سيحتاج Frees إلى الوصول إلى نفس الساحة التي تم استخدامها في Malloc. يمكن أيضًا تحسين ذلك عن طريق المكان الذي يتم تحرير المؤشر على قائمة مجانية. هذا يمكن القيام به من الناحية الذرية. عندما يتم فتح الساحة التالية ، سيتم تحرير جميع المؤشرات في القائمة المجانية بشكل صحيح.

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

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