قائمة انتظار متزامنة متعددة المنتجين والمستهلكين ومكتوبة بلغة C++ 11.
انها معركة تصلب وتستخدم يوميا في الإنتاج:
وقد نقلته الصحف التالية:
MPMCQueue< int > q ( 10 );
auto t1 = std::thread([&] {
int v;
q. pop (v);
std::cout << " t1 " << v << " n " ;
});
auto t2 = std::thread([&] {
int v;
q. pop (v);
std::cout << " t2 " << v << " n " ;
});
q.push( 1 );
q.push( 2 );
t1.join();
t2.join();
MPMCQueue<T>(size_t capacity);
إنشاء قائمة MPMCQueue
جديدة تحتوي على عناصر من النوع T
capacity
استيعابية.
void emplace(Args &&... args);
قم بوضع عنصر في قائمة الانتظار باستخدام البناء الموضعي. كتل إذا كانت قائمة الانتظار ممتلئة.
bool try_emplace(Args &&... args);
حاول وضع عنصر في قائمة الانتظار باستخدام البناء الموضعي. يُرجع true
عند النجاح false
إذا كانت قائمة الانتظار ممتلئة.
void push(const T &v);
قم بوضع عنصر في قائمة الانتظار باستخدام إنشاء النسخ. كتل إذا كانت قائمة الانتظار ممتلئة.
template <typename P> void push(P &&v);
قم بوضع عنصر في قائمة الانتظار باستخدام إنشاء الحركة. يشارك في تحليل التحميل الزائد فقط إذا كانت std::is_nothrow_constructible<T, P&&>::value == true
. كتل إذا كانت قائمة الانتظار ممتلئة.
bool try_push(const T &v);
حاول وضع عنصر في قائمة الانتظار باستخدام إنشاء النسخ. يُرجع true
عند النجاح false
إذا كانت قائمة الانتظار ممتلئة.
template <typename P> bool try_push(P &&v);
حاول وضع عنصر في قائمة الانتظار باستخدام إنشاء الحركة. يشارك في تحليل التحميل الزائد فقط إذا كانت std::is_nothrow_constructible<T, P&&>::value == true
. يُرجع true
عند النجاح false
إذا كانت قائمة الانتظار ممتلئة.
void pop(T &v);
قم بإدراج عنصر في قائمة الانتظار عن طريق نسخ العنصر أو نقله إلى v
. كتل إذا كانت قائمة الانتظار فارغة.
bool try_pop(T &v);
حاول إلغاء وضع عنصر في قائمة الانتظار عن طريق نسخ العنصر أو نقله إلى v
. يُرجع true
عند النجاح false
إذا كانت قائمة الانتظار فارغة.
ssize_t size();
إرجاع عدد العناصر في قائمة الانتظار.
يمكن أن يكون الحجم سالبًا عندما تكون قائمة الانتظار فارغة ويوجد قارئ واحد على الأقل في انتظاره. نظرًا لأن هذه قائمة انتظار متزامنة، فإن الحجم هو مجرد أفضل جهد للتخمين حتى يتم ضم جميع سلاسل رسائل القارئ والكاتب.
bool empty();
يُرجع صحيحًا إذا كانت قائمة الانتظار فارغة.
نظرًا لأن هذه قائمة انتظار متزامنة، فهذا مجرد تخمين أفضل جهد حتى يتم ضم جميع سلاسل رسائل القارئ والكاتب.
جميع العمليات باستثناء البناء والتدمير آمنة.
إنكيو:
قائمة الانتظار:
مراجع:
اختبار خوارزميات التزامن أمر صعب. أنا أستخدم طريقتين لاختبار التنفيذ:
boost::lockfree::queue
وغيرها static_assert
إذا كان ذلك متاحًا std::hardware_destructive_interference_size
إذا كان ذلك متاحًا [[nodiscard]]
تم إنشاء هذا المشروع بواسطة إريك ريجتورب <[email protected]>.