私は現在、POSIX スレッドを学習しており、並行性全体を把握することに取り組んでいます。のマニュアルページを見ていますsem_init()
。渡されたセマフォをスレッド間で共有するか (ゼロ)、プロセス間で共有するか (ゼロ以外) を定義する引数を取ります。誰かがここでの違いをよく説明してくれませんか。私は基本を理解していると思いますが、いくつかのアドバイスと説明をいただければ幸いです。
質問する
562 次
1 に答える
3
まあ、違いは多かれ少なかれ明らかなはずですman sem_init
:
その場合
pshared == 0
、セマフォは現在のプロセスの外では見えず、このプロセスが終了すると自動的に破棄される可能性があります。したがって、このプロセスに属するスレッド間で同期することだけが役に立ちます。スレッドは常にメモリを共有するためsem
、追加のアクションなしで、任意のスレッドが引数を直接使用できます。pshared != 0
が指すメモリにアクセスできる場合、このセマフォは他のプロセスで使用できますsem
。そのためには、共有メモリが必要になるか、セマフォの作成fork()
後に使用して継承する必要があります。また、セマフォを明示的に破棄しないと、一部の実装 (どの実装かはわかりません) でセマフォがリークする可能性があります。
もちろん、ゼロ以外の psharedセマフォを使用してスレッドを同期し、プロセス部分を無視することもできます。ただし、プロセス セマフォはより多くのリソース (通常は OS オブジェクト) を使用しますが、スレッド セマフォは通常、ユーザーランドで 100% 実装できます。そうすることは、リソースを浪費するだけです。
于 2013-08-18T00:42:53.043 に答える