ホームページ > バックエンド開発 > C++ > オブジェクト参照を C 11 スレッドに安全に渡すにはどうすればよいですか?

オブジェクト参照を C 11 スレッドに安全に渡すにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-19 14:57:03
オリジナル
588 人が閲覧しました

How Can I Safely Pass Object References to C  11 Threads?

オブジェクト参照引数をスレッド関数に渡す: コンストラクターの問題

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート