オブジェクト参照引数をスレッド関数に渡す: コンストラクターの問題
C 11 では、std::thread インターフェイスにより次のものが作成できます。軽量の糸。一般的なタスクの 1 つは、これらのスレッド関数に引数を渡すことですが、オブジェクト参照を渡そうとすると問題が発生する可能性があります。
次の例を考えてみましょう。
void foo(int &i) { std::cout << i << std::endl; } int k = 10; std::thread t(foo, k);
このコードは、次のように正常にコンパイルされ、実行されます。整数はスレッド関数にコピーされます。ただし、 std::ostream オブジェクト参照を渡すとコンパイルされません:
void foo(std::ostream &os) { os << "This should be printed to os" << std::endl; } std::thread t(foo, std::cout);
エラーは、コンストラクターが見つからないかアクセスできないことを示します。
解決策: std::ref を使用します
スレッドはデフォルトで引数をコピーします。参照を明示的に渡すには、別のアプローチが必要です。ここで std::ref が登場します。値セマンティクス ラッパーでオブジェクト参照をラップします。
std::ref を使用すると、スレッド関数はラッパーのコピーを受け取りますが、ラップされた参照は残ります。同じ:
std::thread t(foo, std::ref(std::cout));
これにより、スレッド関数が元のオブジェクトにアクセスして変更できるようになり、必要な機能が可能になります。
参照されるオブジェクトは全体を通してアクセス可能な状態を維持する必要があることに注意することが重要です。スレッドの実行。スレッドが終了する前に削除または変更すると、予期しない動作やクラッシュが発生する可能性があります。
以上がオブジェクト参照を C 11 スレッドに安全に渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。