Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux Learn Typing

C++طريقة تشغيل أكثر من ثريد في وقت واحد

في المثال التالي قمنا بتعريف دالة إسمها foo() عند استدعائها تقوم بطباعة الجملة "foo is executed.." 5 مرات.
بعدها قمنا بتعريف دالة أخرى إسمها bar() عند استدعائها تقوم بطباعة الجملة "bar is executed.." 5 مرات أيضاً.
في الأخير قمنا بإنشاء كائنين من الكلاس thread, الأول ينفذ الدالة foo() و الثاني ينفذ الدالة bar().

المثال الأول

main.cpp
#include <iostream>
#include <thread>
#include <chrono>

using namespace std;

// عند استدعائها تقوم بطباعة النص foo() هنا قمنا بتعريف دالة إسمها
// خمس مرات مع التوقف لمدة ثانية في كل مرة "foo is executed.."
void foo()
{
    for(int i=1; i<=5; i++)
    {
        cout << "foo is executed.. \n";
        this_thread::sleep_for(chrono::seconds(1));
    }
}

// عند استدعائها تقوم بطباعة النص bar() هنا قمنا بتعريف دالة إسمها
// خمس مرات مع التوقف لمدة ثانية في كل مرة "bar is executed.."
void bar()
{
    for(int i=0; i<5; i++)
    {
        cout << "bar is executed.. \n";
        this_thread::sleep_for(chrono::seconds(1));
    }
}

int main()
{
    // bar() و الثاني يقوم بتشغيل الدالة foo() الأول يقوم بتشغيل الدالة thread هنا قمنا بإنشاء كائنين من الكلاس 
    thread t1(foo);
    thread t2(bar);

    // لجعل المترجم ينتظر تنفيذ أوامر t2 و t1 من الكائنين join() هنا قمنا باستدعاء الدالة
    // main() بالكامل قبل أن يتابع تنفيذ باقي الأوامر الموجودة في الدالة t2 و t1 الكائنين 
    t1.join();
    t2.join();
    
    // عند التنفيذ سيتم تنفيذ أمر الطباعة التالي و الذي يعني أنهما توقفا عن التنفيذ t2 و t1 إذاً بعد توقف الكائن 
    cout << "All threads are stopped!";
    
    return 0;
}

سنحصل على نتيجة تشبه النتيجة التالية عند التشغيل.

foo is executed..
bar is executed..
bar is executed..
foo is executed..
bar is executed..
foo is executed..
bar is executed..
foo is executed..
bar is executed..
foo is executed..
All threads are stopped!


في المثال التالي قمنا بإعادة المثال الأول و لكننا قمنا بتعريف الدالة التي سينفذها الثريد بأسلوب Lambda Expression.

المثال الثاني

main.cpp
#include <iostream>
#include <thread>
#include <chrono>

using namespace std;

int main()
{
    // خمس مرات مع التوقف لمدة ثانية في كل مرة "t1 is executed.." يقوم بطباعة الجملة thread هنا قمنا بإنشاء كائن من الكلاس 
    thread t1( []{
        for(int i=1; i<=5; i++)
        {
            cout << "t1 is executed.. \n";
            this_thread::sleep_for(chrono::seconds(1));
        }
    });
    
    // خمس مرات مع التوقف لمدة ثانية في كل مرة "t2 is executed.." يقوم بطباعة الجملة thread هنا قمنا بإنشاء كائن من الكلاس 
    thread t2( []{
        for(int i=0; i<5; i++)
        {
            cout << "t2 is executed.. \n";
            this_thread::sleep_for(chrono::seconds(1));
        }
    });

    // لجعل المترجم ينتظر تنفيذ أوامر t2 و t1 من الكائنين join() هنا قمنا باستدعاء الدالة
    // main() بالكامل قبل أن يتابع تنفيذ باقي الأوامر الموجودة في الدالة t2 و t1 الكائنين 
    t1.join();
    t2.join();
    
    // عند التنفيذ سيتم تنفيذ أمر الطباعة التالي و الذي يعني أنهما توقفا عن التنفيذ t2 و t1 إذاً بعد توقف الكائن 
    cout << "All threads are stopped!";
    
    return 0;
}

سنحصل على نتيجة تشبه النتيجة التالية عند التشغيل.

t1 is executed..
t2 is executed..
t2 is executed..
t1 is executed..
t2 is executed..
t1 is executed..
t2 is executed..
t1 is executed..
t2 is executed..
t1 is executed..
All threads are stopped!