ホームページ  >  記事  >  バックエンド開発  >  オブジェクト参照を C 11 std::thread 関数に正しく渡すにはどうすればよいですか?

オブジェクト参照を C 11 std::thread 関数に正しく渡すにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-26 11:47:10436ブラウズ

How to Correctly Pass Object References to C  11 std::thread Functions?

オブジェクト参照をスレッド関数に渡す

C 11 std::thread インターフェイスを使用する場合、オブジェクト参照を渡そうとすると問題が発生する可能性があります。オブジェクト参照をスレッド関数の引数として使用します。この問題は、次のコードに見られるように、単純な整数を渡す場合でも発生します。

void foo(int& i) {
    // Do something with i
    std::cout << i << std::endl;
}

int k = 10;
std::thread t(foo, k);

このコードは期待どおりにコンパイルおよび実行されますが、std::ostream 参照を渡すとコンパイル エラーが発生します。

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));

std::ref を使用すると、スレッド関数に参照を渡すことができ、渡された関数を直接操作できるようになります。物体。ただし、参照されるオブジェクトがスレッドの実行中存続していることを確認することが重要です。

以上がオブジェクト参照を C 11 std::thread 関数に正しく渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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