記事C ++ 11スレッドライブラリ(1)コンストラクタとそのメンバーでは、次の構築方法があることがわかっています。
thread() noexcept;//since c++11
thread(thread&& other) noexcept;//since c++11
template<class Function,class ...Args>
explicit thread(Function &&f,Args && ...args);//since c++11
thread(const thread&)=delete;//since c++11
全部で4つあります。1つ目は何もしないスレッドオブジェクトを作成するデフォルトの構成です。2つ目はstd :: move()が呼び出すmoveコンストラクターです。3つ目はクラステンプレートです。これは、関数オブジェクトいくつかのパラメーターを使用して、対応するスレッドクラスを生成します。4番目はコピーコンストラクターであり、デフォルトではコピーできません。
3番目はスレッドオブジェクトを作成する基本的な方法です、彼は必要です
- 関数オブジェクト
- 0個以上のパラメーター
関数オブジェクトは、次のように定義されている関数テンプレートから生成できます。
template< class >
class function; /* undefined */
(since C++11)
template< class R, class... Args >
class function<R(Args...)>;//用R类实例化函数对象
クラスと対応するパラメーターを指定すると、クラステンプレートはstd :: functionクラスを生成します。テンプレートのクラスRパラメータには特定の要件があります。要件を満たす一般的なクラスは次のとおりです。
- 通常の機能
- ラムダ式
- バインド式
- その他の呼び出し可能なオブジェクト(ファンクターなど)
- メンバー関数ポインター
- メンバー関数データメンバー(クラスデータメンバー?)
注
スレッド関数の引数は、値によって移動またはコピーされます。参照引数をスレッド関数に渡す必要がある場合は、ラップする必要があります(たとえば、std :: refまたはstd :: crefを使用)。
関数からの戻り値はすべて無視されます。関数が例外をスローすると、std :: terminateが呼び出されます。戻り値または例外を呼び出し元のスレッドに戻すために、std :: promiseまたはstd :: asyncを使用できます。
例:奇数と偶数をそれぞれ印刷する2つのスレッドを作成します
#include <iostream>
#include <thread>
using namespace std;
void show_even()
{
for(int i=0;i<10;i+=2)
{
cout<<i;
}
};
void show_odd()
{
for(int i=1;i<10;i+=2)
{
cout<<i;
}
}
int main()
{
thread th1(show_odd);
thread th2(show_even);
th1.join();
th2.join();
return 0;
}
各実行の結果は異なります0246813579
1357902468
1350247968
。次の3つの結果のいずれかを取ります。CPUは、一度に1つのスレッドでのみ実行されます。処理速度が十分に単純な場合、一方のスレッドのすべてのコンテンツが完了しているが、もう一方のスレッドはまだ開始されていない可能性があります。
単純な実行コンテンツの場合、ラムダを使用して呼び出し可能なオブジェクトを作成する方が適切です。
int main()
{
thread th1([](){
for(int i=0;i<10;i+=2){
cout<<i;}});
thread th2([](){
for(int i=1;i<10;i+=2){
cout<<i;}});
th1.join();
th2.join();
return 0;
}
関数名について考える必要はなく、特別な関数blablaを作成する必要もありません。