web-dev-qa-db-ja.com

複数の引数をstd :: threadに渡します

私は<thread> C++ 11標準のライブラリ。

次のような機能があるとします。

void func1(int a, int b, ObjA c, ObjB d){
    //blahblah implementation
}

int main(int argc, char* argv[]){
    std::thread(func1, /*what do do here??*/);
}

これらすべての引数をスレッドにどのように渡しますか?私は次のような引数をリストしようとしました:

std::thread(func1, a,b,c,d);

しかし、そのようなコンストラクターがないことは不満です。これを回避する1つの方法は、引数をパッケージ化する構造体を定義することですが、これを行う別の方法はありますか?

41
turtlesoup

文字通り、オブジェクトが存在する場合にコンパイルされるはずだったstd::thread(func1,a,b,c,d);でそれらを渡すだけですが、別の理由で間違っています。オブジェクトが作成されていないため、スレッドを結合または切り離すことができず、プログラムは正しく動作しません。これは一時的なものであるため、スレッドはまだ結合または分離されていないため、デストラクタがすぐに呼び出されます_std::terminate_が呼び出されます。 std::thread(func1,a,b,c,d).join();//or detachのように、tempが破棄される前に_std::join_または_std::detach_できます。

これがどのように行われるべきかです。

_std::thread t(func1,a,b,c,d);
t.join();  
_

スレッドをデタッチすることもできます。参加とデタッチの違いがわからない場合は、スレッドを参照してください。

50
aaronman

これを取得している場合は、#include <thread>ファイルの先頭。 OPの署名は機能するはずです。

0
pixelpax