タグ付けされた質問 「stdthread」

6
main()が終了すると、切り離されたスレッドはどうなりますか?
私はそれを開始しているstd::threadと仮定しdetach()て、それstd::threadが一度それを表していたとしても、スレッドがスコープ外になったとしても、スレッドは実行を続けます。 さらに、プログラムには、切り離されたスレッド1に参加するための信頼できるプロトコルがないため、main()終了時に切り離されたスレッドが引き続き実行されると仮定します。 1.10と30.3のどちらにも適切な表現が含まれておらず、何が起こるかを説明している標準(より正確には、N3797 C ++ 14ドラフト)には何も見つかりません。 1別の、おそらく同等の質問は、「デタッチされたスレッドを再び結合できるか」です。これは、どのプロトコルを結合しようと考えている場合でも、スレッドがまだ実行されている間にシグナリング部分を実行する必要があるため、OSスケジューラが受信側がスレッドが実際に終了したことを確実に検出する方法がなく、シグナリングが実行された直後に、スレッドを1時間スリープさせることにしました。 が不足している場合はmain()デタッチスレッドが実行されているとすると、未定義の動作で、その後、任意の使用は、std::thread::detach()メインスレッドが終了したことがない場合を除き、未定義の動作です2。 したがって、main()デタッチされたスレッドを実行して実行すると、定義された効果が必要になります。問題は次のとおりです。(C ++標準では、POSIXではなく、OSドキュメントではありません...)定義されている効果です。 2切り離されたスレッドは結合できません(の意味でstd::thread::join())。デタッチされたスレッドからの結果を待つことはできますが(たとえば、からstd::packaged_task、またはカウントセマフォまたはフラグと条件変数によって)、それはスレッドが実行を完了したことを保証するものではありません。あなたがスレッドの最初の自動オブジェクトのデストラクタにシグナリング部分を入れない限り、確かに、そこになり、一般的には、その実行コード(デストラクタ)も後のシグナリングコード。OSがメインスレッドをスケジュールして結果を消費し、デタッチされたスレッドがデストラクタの実行を完了する前に終了する場合、^ Wisはどのように定義されますか?

5
いつstd :: thread :: detachを使用すればよいですか?
std::threadアプリケーションを高速化するために使用する必要がある場合があります。join()スレッドが完了するまで待機することも知っています。これは理解しやすいですが、detach()呼び出すことと呼び出さないことの違いは何ですか? なしdetach()では、スレッドのメソッドはスレッドを独立して使用して動作すると思いました。 切り離さない: void Someclass::Somefunction() { //... std::thread t([ ] { printf("thread called without detach"); }); //some code here } デタッチして呼び出す: void Someclass::Somefunction() { //... std::thread t([ ] { printf("thread called with detach"); }); t.detach(); //some code here }
139 c++  c++11  stdthread 

10
C ++ 11でのスレッドプーリング
関連する質問: C ++ 11について: C ++ 11:std :: thread pooled? C ++ 11のasync(launch :: async)は、高価なスレッドの作成を回避するためにスレッドプールを廃止しますか? ブーストについて: スレッドを再利用するC ++ブーストスレッド boost :: threadとそれらのプールの作成! タスクを何度も作成したり削除したりせずに、タスクをに送信するスレッドのプールを取得するにはどうすればよいですか?これは、結合せずに再同期する永続的なスレッドを意味します。 次のようなコードがあります。 namespace { std::vector<std::thread> workers; int total = 4; int arr[4] = {0}; void each_thread_does(int i) { arr[i] += 2; } } int main(int argc, char *argv[]) { …

6
std :: threadがまだ実行されているかどうかを確認する方法は?
std::threadがまだ実行されているかどうかを(プラットフォームに依存しない方法で)確認するにはどうすればよいですか?それはtimed_join()方法を欠いており、そのためのものでjoinable()はありません。 std::lock_guardスレッド内のaでミューテックスをロックし、ミューテックスのtry_lock()メソッドを使用して、それがまだロックされている(スレッドが実行されている)かどうかを判断することを考えましたが、不必要に複雑に思えます。 もっとエレガントな方法を知っていますか? 更新:明確にするために:スレッドが正常に終了したかどうかを確認したいと思います。「ぶら下がっている」スレッドは、この目的で実行されていると見なされます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.