4
一般的にどのスレッドが共有しますか?
さて、これは一般的な質問です。そして、もし誰かがそれを実装固有にしたいなら、私はUnix関連のものを好むでしょう。しかし、まず一般的に次の問題を知る必要があります。 私は単一のプロセスが複数のスレッドを持つことができると読みました。同じプロセスの複数のスレッドは、それらの間で物事を共有します。彼らが何を共有し、何を共有していないのか知りたい。プロセスがアドレス空間、スタック、ヒープ、グローバル変数、コード、データ、OSリソースで構成されていることを考慮して、スレッド間で共有されるものは何ですか?私は次の推測を持っています: グローバル変数-スレッド共有グローバル変数を読み取りました。また、JavaとC#でプログラミングしているときに、クラスレベルの変数を共有するスレッドを作成しました。したがって、スレッドはグローバル変数を共有すると信じています(ただし、高レベルのプログラミング言語の概念がそのまま低オペレーティングシステムレベルの事実に変換されるかどうかはわかりません)。 ヒープ-グローバル変数はヒープに格納されるため、ヒープはスレッド間で共有されます。 スタック-各スレッドは独自の実行シーケンス/コードを持つことができるため、プログラムカウンターの内容をプッシュ/ポップする独自のスタックを持っている必要があります(関数呼び出しと戻りが発生した場合)。したがって、同じプロセスのスレッドはスタックを共有しません。 今、私は次のものの共有について確信が持てない アドレス空間-アドレス空間で何が正確にカウントされるのかわからない。しかし、アドレス空間は一般的にスレッドではなくプロセスのコンテキストで使用されると思います。また、同じプロセスのすべてのスレッドは親プロセスと同じアドレス空間に存在するため、スレッドはアドレス空間を共有すると言われています。(しかし、それらは同じアドレス空間内で異なるスタックを維持しますか?) OSリソース-これは非常に実装固有であると思います。たとえば、親プロセスは、すべてではなくそのスレッドの一部に同じファイルのハンドルを選択的に与えることができます。または私は誤解しており、OSリソースはファイル以外のものを意味しますか? コード-スレッドは異なるコードを持つことができるため、コードの共有が常に当てはまるわけではありません。 データ-データの下で何を考慮すべきかわからない。ただし、グローバル変数がスレッド間で共有されていることを確認してください。そして、ローカル変数が同様に共有されていないことを確認してください。 全体的に、あいまいな用語、オペレーティングシステムの書籍で行われている超一般化、およびオンラインで提供される実装固有の詳細により、かなり混乱しています。だから私は私を満足させることができるいくつかの答えを見つけようとしています。