のTerminateProcessのドキュメントは、部分的に、こう述べています。TerminateProcess(GetCurrentProcess()、exit_code)の後に待機が必要ですか?
This function stops execution of all threads within the process and requests
cancellation of all pending I/O.
...
TerminateProcess is asynchronous; it initiates termination and returns
immediately. If you need to be sure the process has terminated, call the
WaitForSingleObject function with a handle to the process.
これは、プロセスの自殺をのTerminateProcessを使用する場合は、このように、何が起こるかについて、いくつかのあいまいさを残し:
TerminateProcess(GetCurrentProcess(), exit_code)
論理的には十分なものでなければならないこと、文書にはと記載されていますが、その後に処理が続行される可能性があります。不確定な状態になるバグのためにTerminateProcessを呼び出すと危険です。
私は待っオン自殺が必要とされていないことを確認することがわかっている最も近いものがで_invoke_watsonするソース・コードです:
C:\Program Files (x86)\Windows Kits\10\Source\10.0.10240.0\ucrt\misc\invalid_parameter.cpp
この機能はありません最後のものは、それ自体でのTerminateProcessを呼び出すことである - と待ってはいけない。
確信を得ることは良いことであり、答えがドキュメントの補足として役立つように、ここで質問したかったのです。
私は分かりませんが、あなたのプロセスがどれほど壊れていても、安全な側にあるためには、 'Sleep(INFINITE);の後に' TerminateProcess'を呼び出しても安全です。 –
私は「ただ安全な側にいる」ということを嫌います。そのことは、単に安全のために配列に余分な要素を割り当てるというような醜さにつながります。私はむしろ文書化された保証を使用したいと思う。 しかし、あなたはサスペンダーと同様にベルトを置くことに本当の害がないということは間違いありません。 –
私はTerminateProcess *がこの1つのケースでは同期的であるという疑いがあります(実際にはExitProcessが実際に行っていることを読んでいるようです)。しかし、誰かがそれを書いた文書を見つけることができなければ、文書化された契約。 :-) –