オブジェクト参照をスレッド関数に渡す: 課題を理解する
C の std::thread インターフェイスで、オブジェクト参照引数をスレッドに渡す関数ではコンパイル エラーが発生する可能性があります。この記事では、これらのエラーの根本的な理由を調査し、解決策を示します。
オブジェクト参照の受け渡しについて
この例では、整数 (k) をオブジェクトに渡すことができます。
void foo(int &i) { // Do something with i std::cout << i << std::endl; } int k = 10; std::thread t(foo, k);
ただし、ostream 参照をスレッド関数に渡そうとするとコンパイルが発生します。 error:
void foo(std::ostream &os) { // Do something with os os << "This should be printed to os" << std::endl; } std::thread t(foo, std::cout);
削除されたコンストラクター
コンパイル エラーの原因は、std::thread にオブジェクト参照の直接受け渡しを妨げる削除されたコンストラクターがあるという事実にあります。スレッドは競合状態を避けるために引数をコピーする必要があるため、これは意図的なものです。
解決策: std::ref
オブジェクト参照を明示的に渡すには、次のようにラップします。 std::ref (定数参照の場合は std::cref)。このソリューションでは、参照のコピーが確実にスレッド関数に渡され、安全性が確保されます。
std::thread t(foo, std::ref(std::cout));
オブジェクトのライフタイムの保持
次の点に注意することが重要です。参照ラッパーにはオブジェクトへの参照のみが含まれます。したがって、スレッドの実行中はオブジェクトが存続していることを確認することが重要です。そうしないと、未定義の動作が発生します。
以上がオブジェクト参照を C スレッドに渡すとコンパイル エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。