C++11/std::thread - 線程管理join/detach

1 join方法

代碼示例:

#include <iostream>
#include <thread>

void HelloWorld()
{
    std::cout << "hello world" << std::endl;
}

int main()
{
    std::thread helloWorldThread(HelloWorld);

    helloWorldThread.join();

    getchar();

    return 0;
}

在上述代碼中,線程函數HelloWorld將會被子線程helloWorldThread啓動,並運行在該線程中,而join函數會阻塞線程,直到線程函數執行完畢,如果線程函數有返回值,那麼返回值將會被忽略。

2 detach方法

如果我們不想線程被阻塞怎麼辦?使用detach方式,但是風險很高,你可以聯想C++的野指針。

在下列代碼中,線程函數HelloWorld將會被子線程helloWorldThread啓動,並運行在該線程中,detach方法會將線程與線程對象分離,讓子線程作爲後臺線程執行,當前的線程也不會被阻塞。但是,線程detach之後無法與當前線程取得任何聯繫,也就是說detach之後無法使用join等待線程執行完成,因爲線程detach之後何時執行完畢取決於其函數體內的運算邏輯。
代碼示例:

#include <iostream>
#include <thread>

void HelloWorld()
{
    std::cout << "hello world" << std::endl;
}

int main()
{
    std::thread helloWorldThread(HelloWorld);

    helloWorldThread.detach();
    
    // do other things 馬上可以做其他事情,不會被阻塞
    

    getchar();

    return 0;
}

如果有興趣,可以訪問我的個站:www.stubbornhuang.com

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