C++ でマルチスレッドを実装する方法

C Demaruchisureddowo Shi Zhuangsuru Fang Fa



C++ のマルチスレッドは、複数のタスクを同時に実行できるようにする機能です。スレッドは、実行される特定のプロセスの作業単位です。多数のスレッドが互いに独立して同時に実行され、マルチスレッドが実行されます。

C++ でマルチスレッドを実装する方法

マルチスレッド プログラムには、同時に実行される傾向のある 2 つ以上の部分があり、各部分はスレッドとして知られ、異なる実行パスを持ちます。多数のスレッドが互いに独立して同時に実行され、マルチスレッドが実行されます。







C++ でのマルチスレッドの前提条件

Windows では、スレッドに関連する関数は C++ 11 以降のバージョンで実行できます。 Dev-C++ コンパイラを使用する場合、デフォルトでは C++ 3 バージョンになるため、手動で C++ 11 バージョンに変更する必要があります。言語標準設定を変更することでGNU C++11環境を選択できます。



Dev-C++ コンパイラを開き、タスクバーの「ツール」に移動します。 「コンパイラ オプション」を選択し、「設定」を選択し、「コード生成」ブロックをクリックするとコマンドのリストが表示されます。 「言語標準(-std)」からGNU C++11を選択し、「OK」をクリックします。これで、このコンパイラはスレッド操作をサポートするようにすべて設定されました。




GitHub からライブラリをダウンロードする これらを Cpp コンパイラの lib フォルダーに置きます。 #include “mingw.thread.h” と ヘッダー ファイルを使用して、プログラム内でこれらのライブラリを呼び出します。その構文は次のとおりです。





std::thread スレッドオブジェクト ( 呼び出し可能 ;


std::thread は、C++11 の #include “mingw.thread.h” ヘッダー ファイルによってサポートされています。これはスレッド クラスであり、単一のスレッドを表します。 std::thread を使用して新しいスレッドが作成され、呼び出し可能オブジェクトがそれに渡されます。 Callable は実行可能コードであり、スレッドの実行時に実行されます。 Callable は、以下の 3 つのタイプのいずれかになります。

オブジェクトが作成されると、呼び出し可能オブジェクト内のコードを実行する新しいスレッドが起動されます。



関数オブジェクトを使用したスレッドの起動

関数オブジェクトはスレッドを起動するための呼び出し可能オブジェクトとして使用でき、オーバーロード演算子 () によって呼び出し可能になります。

クラス関数_オブジェクト_クラス {
ボイド演算子 ( ( パラメータ
{
声明;
}
}
std::thread スレッドオブジェクト ( 関数オブジェクトクラス ( 、パラメータ


オーバーロード関数は、最初のオブジェクトとしてコンストラクターに提供され、2 番目のオブジェクトとしてステートメントに提供されます。

関数ポインタを使用したスレッドの起動

関数ポインターが定義され、スレッドを起動するための呼び出し可能オブジェクトとして使用されます。

void 関数呼び出し ( パラメータ
{
声明;
}
std::thread thread_obj ( 関数呼び出し、パラメータ ;


渡す引数は関数名の後に記述します。

ラムダ式を使用したスレッドの起動

スレッド オブジェクトは、ラムダを呼び出し可能として使用して起動できます。

// ラムダ式を定義する
自動 f = [ ( パラメータ
{
声明;
} ;

std::thread スレッドオブジェクト ( f、パラメータ ;


ラムダ式が定義され、その中でパラメータが呼び出されてスレッドが起動されます。

場合によっては、次のコマンドの実行を開始する前にスレッドを停止する必要があります。の std::thread::join () 関数はスレッドが終了するのを待つために使用されます。たとえば、スレッドに GUI のタスクを割り当てる場合、最初に GUI を適切にロードするためにその終了時間を待つ必要があり、その後、次のコマンドが実行されます。

整数メイン (
{

std::スレッド t1 ( 呼び出し可能 ;
t1.join ( ;
声明;
}

これは、3 つの呼び出し可能なすべてを使用してマルチスレッドを実行するために実行されるプログラムです。 3 つの異なる呼び出し可能オブジェクトは、相互に中断されることなく、それぞれのコマンドを同時に 3 回実行します。

#include
#include <スレッド>
名前空間 std を使用します。


ボイドフー ( int Z
{
のために ( int i = 0 ;私 < Z; i++ {
コート << 「関数を利用したスレッド」
' 呼び出し可能としてのポインター \n ;
}
}


クラススレッド_obj {
公共:
ボイド演算子 ( ( 整数 x
{
のために ( int i = 0 ;私 < バツ; i++
コート << 「関数を利用したスレッド」
' 呼び出し可能なオブジェクト \n ;
}
} ;


// メインコード
整数メイン (
{
コート << 「スレッド 1、2、3」
「独立して運営している」
<< 終わり;


スレッドth1 ( ふー、 3 ;


スレッドth2 ( スレッドオブジェクト ( 3 ;


自動 f = [ ( 整数 x {
のために ( int i = 0 ;私 < バツ; i++
コート << 「ラムダを使用したスレッド」
' 呼び出し可能な式 \n ;
} ;


スレッドth3 ( ふ、 3 ;

th1.join ( ;

th2.join ( ;

th3.結合 ( ;

戻る 0 ;
}


このプログラムでは、関数ポインター、関数オブジェクト、ラムダ式を含む 3 つの呼び出し可能オブジェクトを使用して、3 つのスレッドを同時に起動します。スレッド 1、2、および 3 は、それぞれの値を互いに独立して、中断されることなく同時に出力します。値を 3 回出力します。 join() 関数は、スレッドが終了するのを待つために使用されます。


3 つのスレッドすべての出力が個別に表示され、3 回繰り返されます。各スレッドは、他のスレッドが最初に終了するのを待ちます。

結論

C++ のマルチスレッドは、複数のタスクを同時に実行できるようにする機能です。マルチスレッド プログラムには、同時に実行できる 2 つ以上のセクションがあり、各部分はスレッドとして知られ、実行用の個別のパスがあります。スレッドを起動するために呼び出せる関数は、関数ポインター、関数オブジェクト、ラムダ式の 3 つです。これらによりマルチスレッドが可能になります。