7

パラメータが に渡されるときstd::thread()、新しいスレッドの生成元のスレッドは、すべてのパラメータが新しいスレッド ローカル ストレージに完全にコピーされるまで待機しますか?

簡単な例:

void f()
{  
  int array[10];
  ........ //done something with array  
  std::thread th(someF, array); //assuming that someF accepts int[]  
  th.detach();  
}

f()が終了する前にすべてのデータが安全にコピーされたと自動的に想定する必要がありますか? f()私が目にするシナリオの 1 つは、待機せずに全速力で前進すると仮定すると、破壊されているものthをコピーしようとすることです。array

4

2 に答える 2

4

はい。コピーに失敗すると、構築中のスレッドがスローされます。

§30.3.1.2 スレッド コンストラクタ

テンプレートの明示的なスレッド (F&& f, Args&&... args);

Requires: F と Args 内の各 Ti は、MoveConstructible の要件を満たす必要があります。INVOKE (DECAY_- COPY ( std::forward(f)), DECAY_COPY (std::forward(args))...) (20.8.2) は有効な式でなければなりません。4

効果:スレッド型のオブジェクトを構築します。新しい実行スレッドは INVOKE (DECAY_COPY (std::forward(f)), DECAY_COPY (std::forward(args))...) を実行し、 DECAY_COPY への呼び出しは構築スレッドで評価されます。この呼び出しからの戻り値は無視されます。[注: これは、 f のコピーの呼び出しからスローされなかった例外は、新しいスレッドではなく、構築中のスレッドでスローされることを意味します。—終了注] INVOKE (DECAY_COPY ( std::forward(f)), DECAY_COPY (std::forward(args))...) の呼び出しがキャッチされない例外で終了する場合、 std::terminate が呼び出されます。

同期: コンストラクターの呼び出しの完了は、f のコピーの呼び出しの開始と同期します。

于 2013-11-15T07:26:05.153 に答える
3

はい、新しいスレッドで使用可能なストレージに引数をコピーできない場合、例外がスローされます。

http://en.cppreference.com/w/cpp/thread/thread/threadから

引数の評価およびコピー/移動中にスローされる例外は、新しいスレッドではなく、現在のスレッドでスローされます。

于 2013-11-15T07:24:37.947 に答える