C++ std::threadとは? (初心者向け)
thread(スレッド)とは
コンピュータで扱う処理の単位で、その中でスレッドは最小単位です。
https://wa3.i-3-i.info/word12453.html
「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
https://swri.jp/glossary/スレッド
スマートワーク総研 スレッド
つまり、C++でmain()関数が実行されるときに必ず一つのスレッドが確保されます。この確保されたスレッドをプログラムから見てメインスレッド(親スレッド)と呼びます。
プログラムでthread(シングルスレッド)の確認
前提知識としてthreadが作成されるとOSからIDを割り当てられます。
main()関数のみの簡単なプログラムで、IDを出力してメインスレッドの存在の確認を行ってみます。
https://cpprefjp.github.io/reference/thread/this_thread.html
cpprefjp - C++日本語リファレンス std::this_thread
https://cpprefjp.github.io/reference/thread/thread/get_id.html
cpprefjp - C++日本語リファレンス std::thread::get_id
#include <iostream>
#include <thread>
int main()
{
std::cout << "main開始" << std::endl;
std::cout << "thread ID >> " << std::this_thread::get_id() << std::endl;
std::cout << "main終了" << std::endl;
return 0;
}
main開始
thread ID >> 19528
main終了
このことからプログラムが実行されると自動的にOSからthreadが割り当てらることが確認できました。
この状態をシングルスレッドと呼びます。
複数thread(マルチスレッド)の作成
C++で複数threadを作成するにはstd::thread [新しいスレッド名](スレッドで行いたい処理)でスレッドの作成ができます。このスレッドをプログラムから見てサブスレッド(子スレッド)となります。
https://cpprefjp.github.io/reference/thread/thread.html
cpprefjp - C++日本語リファレンス std::thread
#include <iostream>
#include <thread>
void threadFunc() // スレッドの処理
{
std::cout << "threadFunc開始" << std::endl;
std::cout << "threadFunc thread ID >> " << std::this_thread::get_id() << std::endl;
std::cout << "threadFunc終了" << std::endl;
return;
}
int main()
{
std::thread thread1(threadFunc); // サブスレッド(thread1)を作成、処理としてthreadFuncを設定する
std::cout << "main開始" << std::endl;
std::cout << "main thread ID >> " << std::this_thread::get_id() << std::endl;
std::cout << "main終了" << std::endl;
thread1.join(); // サブスレッド(thread1)の終了を待つ
return 0;
}
main開始
main thread ID >> 17320
main終了
threadFunc開始
threadFunc thread ID >> 17968
threadFunc終了
この実行結果threadIDの違いから複数thread(マルチスレッド)の作成ができました。
また、threadFuncが先に呼び出されていますが実行結果の出力ではmainThreadから先に出力されています。
もし、threadにしなかった場合は
#include <iostream>
#include <thread>
void threadFunc() // スレッドの処理
{
std::cout << "threadFunc開始" << std::endl;
std::cout << "threadFunc thread ID >> " << std::this_thread::get_id() << std::endl;
std::cout << "threadFunc終了" << std::endl;
return;
}
int main()
{
//std::thread thread1(threadFunc); // サブスレッド(thread1)を作成、処理としてthreadFuncを設定する
threadFunc();
std::cout << "main開始" << std::endl;
std::cout << "main thread ID >> " << std::this_thread::get_id() << std::endl;
std::cout << "main終了" << std::endl;
//thread1.join(); // サブスレッド(thread1)の終了を待つ
return 0;
}
threadFunc開始
threadFunc thread ID >> 1128
threadFunc終了
main開始
main thread ID >> 1128
main終了
このようにプログラムのコードは上から順番に処理されるのでthreadFunc処理から先に出力されます。
Discussion