قائمة انتظار متعددة المنتجين ومستهلكين متعددين خالية من القفل (أو حتى خالية من الانتظار).

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

سؤال

أنا أبحث عن وثائق حول كيفية كتابة قائمة انتظار MP/MC لتكون خالية من القفل أو حتى خالية من الانتظار.أنا أستخدم .Net 4.0.لقد وجدت الكثير من أكواد C++، لكنني لست على دراية بنماذج الذاكرة، لذلك هناك فرصة كبيرة لأن أقدم بعض الأخطاء أثناء النقل إلى C#.

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

المحلول

لماذا تعتقد أنك بحاجة إلى قائمة انتظار خالية من القفل؟هل حاولت استخدام ConcurrentQueue<T>, ، ربما تكون محاطة بـ BlockingCollection<T>?

من الصعب كتابة تعليمات برمجية متعددة الخيوط.تعد كتابة التعليمات البرمجية الخالية من القفل أكثر صعوبة ويجب ألا تفعل ذلك بنفسك إلا إذا كنت مضطرًا لذلك.

نصائح أخرى

كخيار للنظر فيه، هناك خوارزمية المنتج المتعدد المحدد قائمة انتظار مستهلك متعددة من قبل Dmitry Vyukov .لقد قمت باستكشاف الخوارزمية إلى .NET، يمكنك العثور على المصادر على github .انها سريعة جدا.

خوارزمية Enqueue:

giveacodicetagpre.

خوارزمية dequeue:

giveacodicetagpre.

رحلتي الأولى ستكون مع ConcurrentQueue<T> ولكن يمكنك تجريد مخزن البيانات الخاص بك بعيدًا خلف الواجهة حتى تتمكن من تغيير عمليات التنفيذ بسهولة.ثم قم بقياس السيناريوهات النموذجية ومعرفة أين ستواجه المشاكل.يتذكر:التحسين المبكر هو أصل كل الشرور.صمم نظامك بحيث لا يكون مرتبطًا بالتنفيذ بل بعقد، ومن ثم يمكنك تحسين عمليات التنفيذ الخاصة بك كما تريد.

لقد ألقيت نظرة على ConcurrentQueue<T> مع ILSpy ويبدو للوهلة الأولى أنه تطبيق خالٍ من القفل - من المحتمل جدًا أن يكون هذا هو بالضبط ما تبحث عنه.

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