オブジェクト参照をスレッド関数に渡す
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 サイトの他の関連記事を参照してください。