📖

C++ std::threadとは? (初心者向け)

2024/09/23に公開

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

main.cpp
#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

main.cpp
#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にしなかった場合は

main.cpp
#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