multithreading c with examples
C ++でのマルチスレッドの簡単な紹介。
Javaでdoubleはどういう意味ですか
このチュートリアルでは、C ++でのマルチスレッドの概要を説明します。
では、スレッドとは何ですか? スレッドは、特定のプロセスの作業単位です。マルチプログラミングオペレーティングシステムでは、さまざまなプロセスが同時に実行されます。
同様の方法で、同じプロセスインスタンスを同時に実行したい場合があります。この場合、各プロセスインスタンスは、スレッドと呼ばれる実行ユニットに割り当てられます。マルチスレッドシステムでは、多数のスレッドが互いに独立して同時に実行されます。
C ++ 11より前は、POSIXスレッドがサポートされていました。ただし、この機能はLinuxまたはUNIXオペレーティングシステムでのみ機能するため、移植性に深刻な問題がありました。したがって、C ++ 11以降では、単一のクラスがあります。 std ::スレッド これは、スレッドのすべての機能を定義します。クラスと関数はヘッダーファイルで定義されています。
学習内容:
の作業
std :: threadを使用すると、新しいスレッドオブジェクトを作成し、それを呼び出し可能オブジェクトに渡す必要があります。呼び出し可能ファイルは、スレッドの実行時に実行する実行可能コードです。したがって、新しいスレッドが必要なときはいつでも、std :: threadのオブジェクトを作成し、そのコンストラクターに引数としてcallableを渡します。
Windows10用の最高のYouTubeダウンローダー
std :: threadオブジェクトが作成されると、新しいスレッドが起動され、callableによって提供されるコードが実行されます。
スレッドオブジェクトに提供される呼び出し可能オブジェクトを定義する方法を見てみましょう。
呼び出し可能オブジェクトは、3つの方法で定義できます。
#1)関数オブジェクトの使用
関数オブジェクトをスレッドオブジェクトの呼び出し可能オブジェクトとして使用できます。関数オブジェクトを使用するには、クラスが必要であり、そのクラスで演算子()をオーバーロードします。このオーバーロードされた関数には、スレッドの作成時に実行されるコードが含まれています。
/ / Define the class for function object class functioObject_class { // Overload () operator void operator()(params) { // code to be executed } }; // Create thread object
std::thread thread_object(functioObject_class (), params)
スレッドオブジェクトの定義方法に注意してください。スレッドオブジェクトのコンストラクターへの最初のパラメーターとして、オーバーロードされた関数を提供し、その引数(params)を2番目の引数として指定します。
#2)関数ポインタの使用
関数ポインタを使用して呼び出すことができるのは、次の方法で定義できます。
void funct_call(params) //code to be executed }
この関数を定義したら、次の方法で、この関数を呼び出し可能としてスレッドオブジェクトを作成できます。
std::thread thread_obj(funct_call, params);
関数に渡される引数(params)は、スレッドオブジェクトの関数名の後に提供されることに注意してください。
#3)ラムダ式の使用
ラムダ式としてcallableを用意し、それをスレッドオブジェクトに渡して実行することもできます。同じもののコードスニペットを以下に示します。
// Define a lambda expression auto f = ()(params) { // code for execution };
std::thread thread_object(f, params);
上記のコードでは、ラムダ式fを定義し、それを最初の引数としてスレッドオブジェクトコンストラクターに渡し、次にそのパラメーター(params)を2番目の引数として渡します。
std::thread join method
場合によっては、別のアクションを開始する前に、現在実行中のスレッドを終了させたいことがあります。
典型的な例は、GUIアプリケーションを開くときです。アプリケーションを開くとすぐに、GUIをロードして初期化するスレッドが開始され、GUIが正しく機能するように、ロードと初期化が正しく行われない限り、アクションを実行できません。
クラスstd :: threadは、他のアクションが実行される前に、現在のスレッド(* thisで示される)が最初に終了することを保証するjoin()メソッドを提供します。
次の例を見てください、
int main() { std::thread t1(callable_code); ….. t1.join(); ….. }
上記の例では、メイン関数はスレッドt1が終了するまで続行するのを待つ必要があります。一般に、スレッドの結合関数は、スレッド呼び出しが実行を終了するまで、他のアクション/機能をブロックします。
スレッドの例
以下に示すプログラムでスレッドを作成および実行するための完全なコーディング例を示します。
#include #include using namespace std; // function to be used in callable void func_dummy(int N) { for (int i = 0; i 出力:
スレッド1 ::呼び出し可能=>関数ポインタ
スレッド1 ::呼び出し可能=>関数ポインタ
スレッド3 ::呼び出し可能=>ラムダ式
スレッド3 ::呼び出し可能=>ラムダ式
スレッド2 ::呼び出し可能=>関数オブジェクト
スレッド2 ::呼び出し可能=>関数オブジェクト
上記の例では、3つの異なる呼び出し可能オブジェクト、つまり関数ポインター、オブジェクト、ラムダ式を使用して3つのスレッドを作成しました。各スレッドの2つのインスタンスを作成し、それらを開始します。出力に示されているように、3つのスレッドは互いに独立して同時に動作します。
推奨読書= >> スレッドテストガイド
結論
このチュートリアルでは、明確な例を使用して、C ++でのマルチスレッドの概念を見てきました。以降のチュートリアルでは、堅牢で効率的なプログラムの作成に役立つC ++トピックをさらに学習します。
Windows10のための最高のPythonのアイデア
=> Easy C ++トレーニングシリーズをお読みください。
推奨読書