C++によるスレッド生成

C++によるスレッド生成

◎環境:Visual Studio 2019

概要

C++によるスレッドの生成のやり方について調査。 Windows.NET FrameworkAPIを使わず、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;
}