OpenMPは、単にスレッドを生成するだけでなく、舞台裏で他の多くのことを行います。また、コードセグメントを配布し、さまざまなスレッドを同期します。混乱を招くpthreads
実装について質問しているように、質問にタグを付けました。fork()
Linuxでは、新しいプロセスを作成し、スレッドの作成に使用されるためfork()
、非常に重量があります。clone()
それでも、2つのスレッドを持つOpenMPセクション構成の大まかな同等物はフォークすることであり、その後、if
構成が従う必要があり、マスタープロセスがdothis()
パスを実行し、子がパスを実行しdothat()
ます。からの戻り値fork()
は、親プロセスと子プロセスで異なり、ブランチの決定に使用できます。次に、親プロセスは子が終了するのを待ちます。これは、リージョンwaitpid()
の最後での暗黙的なバリア同期に類似しています。omp sections
ただし、注意点が1つあります。これfork()
は、COW(コピーオンライト)ページを使用して実装されます。つまり、最初は子のメモリコンテンツは親のメモリコンテンツと同じですが、行われた変更はすべて非公開です。子は、親が自分のメモリで変更した内容を確認できず、その逆も同様です。メモリは、SysV共有メモリプリミティブまたは共有ファイルマッピングのいずれかを使用して、2つの間で明示的に共有する必要があります。
代わりにPOSIXスレッドAPIの使用を検討することをお勧めします。
vfork()
は完全に異なる目的のために設計されたシステムコールであり、プロセスのクローン作成にはまったく適していません。