7

2つの引数を取り、voidを返すworkForThreadという関数があります。次のようなものを使用して、この関数をスレッド化したいと思います。

thread(workForThread,a,b);

abは適切なタイプです。上記のコードはコンパイルされず、「呼び出しの引数が多すぎます」エラーが発生します(「エラーC2197:'void(__cdecl *)(char *)':呼び出しの引数が多すぎます」)

どうすればこれを解決できますか?

注:私はこれらの 2つの質問を見てきましたが、そこで機能する解決策は私には機能しないようです。さらに、c ++ 11に組み込まれている方法があると感じており、それが私が探しているものです。

4

2 に答える 2

13

C++11 では、それを行う方法は多かれ少なかれあなたが試みた方法です:

std::thread myThread(workForThread,a,b);

指定された workForThread は、これら 2 つのパラメーターを受け取る (非メンバー) 関数です。

于 2012-05-07T18:31:54.827 に答える
7

C++11 を使用する場合、コンテキストの (非形式的な) パラメーターを使用するラムダ関数を使用できます。「キャプチャー」

何かのようなもの

void doIt (int a, int b) {  // do something, your workForThread
}

..
int a = 1;
int b = 2;

std:thread r ([=](){doIt (a, b); return 1;});

単一の関数のみを呼び出す場合、新しい関数は作成されないため、juanchopanza の回答の方が効率的かもしれません。

ラムダ バージョンでは、より多くの構成が可能です。最後に 3 つの関数のうち 2 つの関数を呼び出すスレッドを開始するとします。juanchopanza アプローチでは、順列ごとに NAMED 関数が必要になります。

現時点では、両方のアプローチの違いは、ほとんど好みの問題であると考えています。

ラムダ関数についてもっと読みたいとき

C++11 のラムダ式とは何ですか?

于 2012-05-07T18:19:15.067 に答える