すべてのデーモン スレッドが切り離されたスレッドであることは理解していますが、すべての切り離されたスレッドがデーモンではないのはなぜですか?
スレッド「メイン」がスレッド「A」(切り離されていない) を作成し、スレッド「A」がスレッド「B」(切り離された) を作成するとします。「B」の実行中にスレッド「A」を終了できますか?
PS: pthreads を参照して質問していますが、関係なく回答してください。
すべてのデーモン スレッドが切り離されたスレッドであることは理解していますが、すべての切り離されたスレッドがデーモンではないのはなぜですか?
スレッド「メイン」がスレッド「A」(切り離されていない) を作成し、スレッド「A」がスレッド「B」(切り離された) を作成するとします。「B」の実行中にスレッド「A」を終了できますか?
PS: pthreads を参照して質問していますが、関係なく回答してください。
たぶんあなたは最初に読むべきですフォークとスレッドの違いは何ですか?
もっと詳しく説明するには
デーモンスレッド
通常、C / C ++(Linux環境)では、fork()を使用してデーモンを作成します。fork()は、呼び出しプロセスを複製することにより、新しいプロセスを作成します。ここで、親プロセスは終了し、子プロセスは残されます。この子プロセスは、制御端末から切り離され、すべての{stdin、stdout、stderr}を/ dev / nullに再度開き、作業ディレクトリをルートディレクトリに変更します。(もちろん、フラグに基づいています)。Linuxでは、fork()はコピーオンライトページを使用して実装されるため、親のページテーブルを複製し、子に固有のタスク構造を作成するために必要な時間とメモリだけがペナルティになります。
切り離されたスレッド
Pthreadの切り離された動作は異なりますが、(1)切り離されたスレッドは、一度切り離されると元に戻すことはできません。(2)detached属性は、スレッドが終了したときのシステムの動作を決定するだけです。プロセスがexitを使用して終了した場合(または同等に、メインスレッドが戻った場合)、スレッドの終了を妨げることはありません。pthread_detach()関数は、threadによって識別されたスレッドを切り離されたものとしてマークします。デタッチされたスレッドが終了すると、そのリソースは自動的にシステムに解放され、別のスレッドが終了したスレッドと結合する必要はありません。
メモリ モデルに関しては、スレッド B が実行を継続している間にスレッド A が終了する可能性があると思います。さらに、実行中のユーザースレッドがない場合、プログラムは終了します...または、デーモンスレッドのみが残っていると考えられるため、アプリケーションは別の方法で終了します