C++11同時実行-第1部:スレッドの開始

2537 ワード

スレッドの開始
C++11でスレッドを起動するのは簡単です.std:threadを使用してスレッドインスタンスを作成できます.作成が完了すると自動的に起動します.関数を実行するポインタを渡すだけでいいです.次のHello worldコードを見てください.
#include <thread>
#include <iostream>
 
void hello(){
    std::cout << "Hello from thread " << std::endl;
}
 
int main(){
    std::thread t1(hello);
    t1.join();
 
    return 0;
}

スレッドに関連するすべての方法はthreadというヘッダファイルで定義されており、興味深いことに、上記のコードでjoin()関数を呼び出し、メインスレッドにスレッドの実行が終了してから終了するように強制することを目的としています.join()という行のコードを書いていない場合は、Hello from threadと新しい行を印刷した結果、新しい行がない可能性があります.プライマリ・スレッドは、スレッドの実行が完了する前に返される可能性があります.

スレッドID


各スレッドには一意のIDがあり、異なるスレッドを識別します.std:threadクラスにはget_があります.id()メソッドは、対応するスレッドの一意の番号を返します.std::this_threadは、現在のスレッドインスタンスにアクセスし、次の例では、このidの使用方法を示します.
#include <thread>
#include <iostream>
#include <vector>
 
void hello(){
    std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl;
}
 
int main(){
    std::vector<std::thread> threads;
 
    for(int i = 0; i < 5; ++i){
        threads.push_back(std::thread(hello));
    }
 
    for(auto& thread : threads){
        thread.join();
    }
 
    return 0;
}

各スレッドを順に起動し、vectorコンテナに保存します.プログラムの実行結果は予測できません.たとえば、次のようになります.
Hello from thread 140276650997504
Hello from thread 140276667782912
Hello from thread 140276659390208
Hello from thread 140276642604800
Hello from thread 140276676175616

あるいは、複数のスレッドの実行がインタリーブされているため、他の結果もあります.スレッドの実行順序を制御することはできません(そうしないとスレッドは何をしますか?)

Lambdaを使用してスレッドを起動する


スレッドが実行するコードがわずかな場合、関数を作成する必要はありません.lambdaを使用して実行するコードを定義することができます.そのため、最初の例は次のように書き換えることができます.
#include <thread>
#include <iostream>
#include <vector>
 
int main(){
    std::vector<std::thread> threads;
 
    for(int i = 0; i < 5; ++i){
        threads.push_back(std::thread([](){
            std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl;
        }));
    }
 
    for(auto& thread : threads){
        thread.join();
    }
 
    return 0;
}

ここではlambda式を用いて関数ポインタを置き換えたが,結果は同じであった.