C++によるスレッド生成
◎環境:Visual Studio 2019
概要
C++によるスレッドの生成のやり方について調査。 Windowsや.NET FrameworkのAPIを使わず、C++の機能のみでスレッド処理を実現する。
[必要なインクルード]
#include <iostream> #include <thread>
単純なスレッドの作成
メインスレッド+ワーカースレッドの処理の実行
[メインスレッド側]
std::thread t1(worker_thread); // ワーカースレッドの生成/開始 // ここで、必要に応じてメインスレッド側の処理を行う t1.join(); // ワーカースレッドの終了を待機
[ワーカースレッド側]
static void worker_thread() { std::cout << "Worker Thread." << std::endl; }
単純なスレッドの作成(パラメーターあり)
メインスレッド+ワーカースレッドの処理の実行(パラメーターあり)
[メインスレッド側]
std::thread t1(worker_thread_with_arg,1,2); // ワーカースレッドの生成/開始 // ここで、必要に応じてメインスレッド側の処理を行う t1.join(); // ワーカースレッドの終了を待機
[ワーカースレッド側]
static void worker_thread_with_arg(int a,int b) { std::cout << "Worker Thread. a=" << a << ", b=" << b << std::endl; }
コンソールで周期的な処理を実現
C++のスレッド機能を利用し、コンソールアプリケーションで周期的な処理を実現する。 (キー入力を受け付けると終了)
[メインスレッド側]
// ワーカースレッドの生成 std::thread t1(worker_timer); // キー入力を待機する int ch = getchar(); std::cout << "get char = " << ch << std::endl; // キー入力を受け付けると、ワーカースレッド側を終了させる m_bIsStop = true; // ワーカースレッドの終了を待機する t1.join();
[ワーカースレッド側]
const std::chrono::milliseconds period_time(1000); // 周期処理間隔[ms] static bool m_bIsStop = false; static void worker_timer() { std::cout << "worker_timer start" << std::endl; while (!m_bIsStop) { auto start_time = std::chrono::system_clock::now(); // ここで何か周期的な処理を行う std::cout << "."; // 周期タイミングまで待機 auto end_time = std::chrono::system_clock::now(); auto elapse_time = end_time - start_time; if (elapse_time < period_time) { std::this_thread::sleep_for(period_time - elapse_time); } } std::cout << std::endl << "worker_timer end" << std::endl; }