C中のpthreadと子プロセスのデータ共有
-
24-09-2019 - |
質問
私の質問は、親プロセスのデータがfork()
コールによって作成された子プロセスまたはpthread_create()
例えば、もしそうであれば、直接の子プロセスに渡され、グローバル変数は、あるが、親プロセスでの子プロセスの効果値によって行われたその変数に変更していますか?
私は、既存のリソースが不足していた場合、私は申し訳ありませんが、私はGoogleでいくつかの検索を行ってきたんだが、良い結果を見つけることができなかった、事前に部分的および完全な答えを感謝します。
おかげで再びあなたの時間との答えのための
解決
フォークのセマンティクス()とのpthread_create()は少し異なっています。
フォーク()グローバル変数は、親と子供の間で別々になり、新しいプロセスを作成します。そのコピーを、その時点でほとんどのOSの実装は、親と子プロセスの両方を編集するプロセスの試みの一つの物理メモリまで、すべてのグローバル変数の同じ物理メモリページを使用することを意味し、コピー・オン・ライトセマンティクスを使用します。ページは今、各プロセスが独自のコピーを取得し、プロセスが孤立しているように、他のプロセスのを参照してくださいしないように、作られています。
のpthread_create()一方、同じプロセス内で新しいスレッドを作成します。新しいスレッドは、しかし、グローバル変数やヒープスペースは、同じプロセスのすべてのスレッド間で共有され、同じプロセスの他の実行中のスレッドから別のスタック空間を持つことになります。あなたは多くの場合、同じプロセスの複数のスレッド間のメモリの共有部分へのアクセスを調整するために、ミューテックスを必要とする理由はここにあります。
TL; DRのバージョン:フォーク()で、あなたが他の男の変更が表示されていません。 pthread_create()で、あなたが行う。
他のヒント
Aフォークは、ほぼ正確なメモリとファイル記述子を含む、呼び出し元のプロセスのコピーを作成します。グローバル変数は、他のすべてと一緒にコピーされますが、彼らは親プロセスにリンクされている任意の方法ではありません。ファイル記述子もコピーされているので、親と子がこれらを介して相互作用することができます(限り彼らだセットアップ正しく、通常のパイプやソケットペアを経由して)ます。
fork
によっておよびpthread_create
で作成されたスレッド間で作成されたプロセスの間には大きな違いがあります。プロセスは、グローバル変数を共有しないとOSが提供するパイプ、ソケット、またはその他のツールを介して通信する必要があります。良い解決策は、MPI - である。プロセス間通信のためのメッセージパッシングライブラリである
スレッドはかなり異なっています。スレッドは、その発信者とpthread_create
を共有して、すべてのグローバル変数を作成しました。また、呼び出し側スレッドに任意の構造を渡すことができ、この構造は、共有されるであろう。スレッドをプログラミングする際に1は非常に注意しなければならないことを、この手段 - 共有のような量が発生しやすい危険とエラーです。 (それはまだ正常に実装するための練習と専門知識を必要とするが)pthread
APIは、スレッド間の強固な同期のためにミューテックスと条件を提供しています。