4

私の質問はやや概念的です。親プロセスのデータは、fork()呼び出しによって作成された子プロセスまたはによって作成されたスレッドとどのように共有されますかpthread_create()

たとえば、グローバル変数は子プロセスに直接渡されますか? その場合、子プロセスによって行われたその変数の変更は、親プロセスの値に影響しますか?

事前に部分的および完全な回答をいただければ幸いです。既存のリソースが不足している場合は、申し訳ありません。Google で検索しましたが、適切な結果が見つかりませんでした。

あなたの時間と答えをありがとう

4

3 に答える 3

5

fork() と pthread_create() のセマンティクスは少し異なります。

fork() は、グローバル変数が親と子の間で分離される新しいプロセスを作成します。ほとんどの OS 実装はコピー オン ライト セマンティクスを使用します。つまり、プロセスの 1 つが物理メモリを編集しようとするまで、親プロセスと子プロセスの両方がすべてのグローバル変数に対して同じ物理メモリ ページを使用し、その時点でそのコピーが作成されます。ページが作成され、各プロセスが独自のコピーを取得し、他のプロセスを認識しないようになり、プロセスが分離されます。

一方、pthread_create() は、同じプロセス内に新しいスレッドを作成します。新しいスレッドは、同じプロセスの他の実行中のスレッドとは別のスタック スペースを持ちますが、グローバル変数とヒープ スペースは同じプロセスのすべてのスレッド間で共有されます。これが、同じプロセスの複数のスレッド間で共有メモリへのアクセスを調整するためにしばしばミューテックスが必要になる理由です。

TL;DR バージョン: fork() を使用すると、他の人の変更は表示されません。pthread_create() で行います。

于 2010-04-03T10:07:38.470 に答える
2

フォークは、メモリとファイル記述子を含む、呼び出しプロセスのほぼ正確なコピーを作成します。グローバル変数は他のすべてのものと一緒にコピーされますが、親プロセスにはまったくリンクされません。ファイル記述子もコピーされるため、親と子はこれらを介して対話できます (適切にセットアップされている限り、通常はパイプまたはソケットペアを介して)。

于 2010-04-03T09:59:06.430 に答える
1

forkによって作成されたプロセスと で作成されたスレッドの間には大きな違いがありますpthread_create。プロセスはグローバル変数を共有せず、OS によって提供されるパイプ、ソケット、またはその他のツールを介して通信する必要があります。適切な解決策は MPI です。これは、プロセス間通信用のメッセージ パッシング ライブラリです。

スレッドはかなり異なります。で作成されたスレッドは、pthread_createすべてのグローバル変数をその呼び出し元と共有します。さらに、呼び出し元は任意の構造体をスレッドに渡すことができ、この構造体も共有されます。これは、スレッドを使用してプログラミングするときは非常に注意する必要があることを意味します。このような量の共有は危険であり、エラーが発生しやすくなります。API は、スレッド間の堅牢な同期のためのpthreadミューテックスと条件を提供します (ただし、正しく実装するには練習と専門知識が必要です)。

于 2010-04-03T10:06:16.783 に答える