Windows上で外部実行可能ファイルを実行する必要があるマルチスレッドアプリケーションがあるとします。複数のスレッドでCGIスクリプトを呼び出すApacheの場合の最良の例。`CreateProcess`は本当にスレッドセーフですか?
CreateProcess
ドキュメントには、使用制限に関する情報は含まれていません。したがって、スレッドセーフであると考えられます。
CreateProcess
を使用してcl.exe
コマンドを複数のスレッドで実行するプログラムを作成できます。プログラムが行う唯一の仕事は100スレッドの作成で、各スレッドはcl.exe
を実行し、1秒間スリープします。このプログラムを10分間実行するので、cl.exe
600 * 100 = 60000回実行されます。通常はcl.exe
が正常に実行されますが、CreateProcess
が返され、0が返されます。GetLastError
が返されます。8. Microsoftから8 = ERROR_NOT_ENOUGH_MEMORY
。私のシステムには24 GBのメモリがあり、このメモリの40%しか使用していないため不可能です。したがって、エラーは間違っています。
これで、1000スレッドで同じプロセスを実行しましたが、ほとんどすべてCreateProcess
呼び出し結果が偽のERROR_NOT_ENOUGH_MEMORY
になります。
この問題は、私たちがを毎回1つのスレッドで呼び出すことを確実にすると消えます(私はstd::mutex
でそれを行います)。
CreateProcess
はスレッドセーフであると思いますが、mutexを使用して単一スレッドでCreateProcess
を呼び出すマルチスレッドアプリケーションで子プロセスを作成する方が効果的ですか?
これは関連性があります:http://www.devsuperpage.com/search/Articles.aspx?G = 2&ArtID = 4598 – NPE
CreateProcessはスレッドセーフです。あなたは32ビットアプリケーションを実行していますか?あるいは、あなたがシステムを激しく打つと疲れてしまうかもしれない他の多くのリソースがあります。そして、あなたが大量のコアを産み出さなければ、多くのCLが生産性を失うことがない限り。 –
これは、多くのスレッドやプロセスで発生する可能性のある問題の一部を説明するのにも役立ちます。 https://blogs.technet.microsoft.com/markrussinovich/2009/07/05/push-the-limits-of-windows-processes-and-threads/ –