WIN32 プログラミングに詳しい人は、WIN32 のプロセス管理方法が Linux のプロセス管理方法と大きく異なることを知っているはずです。UNIX にはプロセスという概念しかありませんが、WIN32 には「スレッド」という概念もあります。と WIN32 はここにあります。違いは何ですか?
WIN32 のプロセス/スレッドは OS/2 から継承されます。 WIN32 では、「プロセス」はプログラムを指し、「スレッド」は「プロセス」内の実行の「手がかり」を指します。コアの観点から見ると、WIN32 のマルチプロセスは Linux のマルチプロセスとあまり変わりません。WIN32 のスレッドは Linux プロセスに相当し、実際に実行されるコードです。ただし、WIN32 では、データ セグメントは同じプロセス内のスレッド間で共有されます。これが Linux プロセスとの最大の違いです。
次のプログラムは、WIN32 の次のプロセスがスレッドを開始する方法を示しています。
int g; DWORD WINAPI ChildProcess(LPVOID lpParameter){ int i; for ( i = 1; i <1000; i ++) { g++; printf( "これは子スレッドです: %dn", g ); } ExitThread( 0 ); }; ボイドメイン() { int スレッド ID; int i; g = 0; CreateThread( NULL, 0, ChildProcess, NULL, 0, &threadID ); for ( i = 1; i <1000; i ++) { g++; printf( "これは親スレッドです: %dn", g ); } }
WIN32 では、CreateThread 関数を使用してスレッドを作成します。Linux でのプロセスの作成とは異なり、WIN32 スレッドは作成時点から実行を開始しません。代わりに、CreateThread で関数を指定し、その関数からスレッドの実行を開始します。このプログラムは前の UNIX プログラムと同じで、2 つのスレッドがそれぞれ 1000 個の情報を出力します。 threadID は子スレッドのスレッド番号です。また、グローバル変数 g は子スレッドと親スレッドで共有されます。これが Linux との最大の違いです。ご覧のとおり、WIN32 のプロセス/スレッドは Linux のプロセス/スレッドよりも複雑です。Linux で WIN32 と同様のスレッドを実装することは、フォークした後、子プロセスが ThreadProc 関数を呼び出して共有ファイルを開くことさえあれば難しくありません。ただし、WIN32 では fork と同様の機能を実装することはできません。したがって、WIN32 で C 言語コンパイラによって提供されるライブラリ関数は、ほとんどの Linux/UNIX ライブラリ関数とすでに互換性がありますが、fork はまだ実装できません。
マルチタスク システムではデータ領域の共有が必要ですが、WIN32 では、プログラマはスレッド間でデータが共有されているのに、スレッドが変数を変更した後に別のスレッドが変更されたことを忘れてしまいがちです。プログラムの問題を引き起こします。しかし、Linuxでは変数は元々共有されていないため、プログラマが共有するデータを明示的に指定することで、より明確で安全なプログラムを実現します。
WIN32における「プロセス」の概念は「アプリケーション」であり、UNIXにおけるexecに相当します。