قوائم المهام لـ C++: نظرة عامة على المكتبات والتنفيذ

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

قوائم المهام لـ C++: دليل شامل للاختيار والتنفيذ



في البرمجة الحديثة بلغة C++، يعد الاستخدام الفعال لتعدد الخيوط مفتاح أداء التطبيقات. أحد الأنماط الأساسية هو قائمة المهام (task queue)، والتي تسمح بتوزيع العمل بين الخيوط دون إدارة يدوية لدورة حياتها. في هذه المقالة، سنستعرض أفضل المكتبات لـ C++ التي تقدم حلولاً جاهزة، وسنوضح أيضًا كيفية تنفيذ قائمة مهام بنفسك.



ما هي قائمة المهام ولماذا نحتاجها



قائمة المهام هي آلية تقوم فيها بوضع "مهام" (دوال، تعبيرات لامبدا، أو كائنات) في قائمة، ويقوم تجمع الخيوط (thread pool) تلقائيًا بتنفيذها. هذا يلغي الحاجة إلى إنشاء وإنهاء الخيوط لكل مهمة، ويقلل من التكاليف الإضافية ويبسط المزامنة.



المزايا الرئيسية:

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


المكتبات الشائعة لقوائم المهام في C++



1. Intel Threading Building Blocks (TBB)

واحدة من أقوى المكتبات، تم تطويرها بواسطة Intel. توفر tbb::parallel_for و tbb::task_group وجدولة مهام مرنة. مناسبة للحوسبة عالية الأداء.

#include <tbb/task_group.h>#include <iostream>

int main() { tbb::task_group tg; tg.run([] { std::cout << "المهمة 1"; }); tg.run([] { std::cout << "المهمة 2"; }); tg.wait(); // انتظار الانتهاء return 0;}


2. Boost.Task (قديم، لكن المفاهيم لا تزال حية في Boost.Fiber)

سابقًا، كانت هناك مكتبة Boost.Task في Boost، والآن انتقلت وظائفها جزئيًا إلى Boost.Fiber. تسمح بإنشاء قوائم ذات أولويات ونتائج غير متزامنة.

// مثال مع Boost.Fiber (البديل الحديث)#include <boost/fiber/all.hpp>#include <iostream>

int main() { boost::fibers::fiber f1([]{ std::cout << "الليف 1"; }); f1.join(); return 0;}


3. PPL (Parallel Patterns Library) - لنظام Windows

مكتبة من Microsoft، مدمجة في Visual Studio. تستخدم concurrency::task و concurrency::parallel_for. تتكامل بشكل ممتاز مع Windows Runtime.

#include <ppltasks.h>#include <iostream>

int main() { concurrency::create_task([]{ std::cout << "مهمة PPL"; }).wait(); return 0;}


4. QtConcurrent - للمشاريع على Qt

إذا كنت تستخدم Qt، فإن QtConcurrent::run و QThreadPool هما طريقة بسيطة لتنظيم قائمة المهام.

#include <QtConcurrent/QtConcurrentRun>#include <iostream>

int main() { QtConcurrent::run([]{ std::cout << "مهمة Qt"; }); QThread::msleep(100); return 0;}


تنفيذ قائمة مهام بسيطة باستخدام std::thread

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



#include <iostream>#include <queue>#include <thread>#include <mutex>#include <condition_variable>#include <functional>

class TaskQueue {public: explicit TaskQueue(size_t threads) { for (size_t i = 0; i < threads; ++i) { workers.emplace_back([this] { while (true) { std::function<void()> task; { std::unique_lock<std::mutex> lock(mutex); condition.wait(lock, [this]

توصيات