20.多線程-基本代碼

示例一:

#include <iostream>
#include <thread>

using namespace std;

void thread1()
{
    for (int n = 0; n<4; n++)
        cout << "i am child thread" << endl;
}//搶佔式

int main()
{
    thread t(thread1);
    t.detach();//分離方式。主線程先結束的話,進程會結束,子線程亦會結束(不論子線程是否已執行完)
    //t.join();//阻塞方式。

    for (int n = 0; n<4; n++)
        cout << "i am main thread" << endl;



    return 0;
}

 

示例二:

#include <iostream>
#include <thread>

using namespace std;

void thread1()
{
    for (int n = 0; n<4; n++)
        cout << "i am child thread" << endl;
}//搶佔式

int main()
{
    thread t(thread1);
    t.detach();//分離方式。主線程先結束的話,進程會結束,子線程亦會結束(不論子線程是否已執行完)
               //t.join();//阻塞方式。

    for (int n = 0; n<4; n++)
        cout << "i am main thread" << endl;


    while (true)
    {
        std::this_thread::sleep_for(std::chrono::microseconds(3));
    }

    return 0;
}

 主線程加入while循環,一直執行不退出。子線程會執行完畢,不會發生:子線程未執行完,主線程退出了,子線程被迫結束。

 

 

示例三:

#include <iostream>
#include <thread>

using namespace std;

void thread1()
{
    for (int n = 0; n<4; n++)
        cout << "i am child thread" << endl;
}//搶佔式

int main()
{
    thread t(thread1);
    t.join();//阻塞方式。

    for (int n = 0; n<4; n++)
        cout << "i am main thread" << endl;



    return 0;
}

子線程執行完了之後,主線程纔會執行

 

示例四:

#include <iostream>
#include <thread>

using namespace std;

void workFun(int index)
{

    for (int i = 0; i < 100; i++)
    {
        cout << index << " child thread " << i << endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(3));
    }
        

}

int main()
{
    thread t[3];
    for (int n = 0; n<3; n++)
    {
        t[n] = thread(workFun, n);
        t[n].join();
    }

    for (int i = 0; i<4; i++)
        cout <<"i am main thread "<< i << endl;

    return 0;
}

子線程會順序執行,t[0]執行完--->t[1]執行完----->t[2]執行完

主線程執行

--------------------------------------------------

示例五:

#include <iostream>
#include <thread>

using namespace std;

void workFun(int index)
{

    for (int i = 0; i < 100; i++)
    {
        cout << index << " child thread " << i << endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(3));
    }
        

}

int main()
{
    thread t[3];
    for (int n = 0; n<3; n++)
    {
        t[n] = thread(workFun, n);
    }

    for (int n = 0; n<3; n++)
    {
        t[n].join();
    }

    for (int i = 0; i<4; i++)
        cout <<"i am main thread "<< i << endl;
return 0;
}

子線程 t[0]   t[1]   t[2] 會並行執行。

子線程執行完成之後,主線程執行。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章