ホームページ >バックエンド開発 >C++ >オブジェクト参照を C スレッドに渡すとコンパイル エラーが発生するのはなぜですか?

オブジェクト参照を C スレッドに渡すとコンパイル エラーが発生するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-03 12:10:16613ブラウズ

Why Does Passing Object References to C   Threads Cause Compilation Errors?

オブジェクト参照をスレッド関数に渡す: 課題を理解する

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。