ある種の宿題があり、exit()の呼び出しやスレッドの強制終了などの明示的な終了を行わずに、プログラムを正常に終了するように求められます。しかし、私は他の方法を考えることができないreturn 0ので、プログラムを正常に終了する方法は何ですか?
6 に答える
スレッドを強制終了することは、プログラムを終了するための適切な方法ではありません。インストラクターが意味するのは、すべてのスレッドが自分自身を終了する前parentにスレッドを待機する必要があるということだと思います。child
理想的にはpthread_exit、メインスレッドからの明示的な呼び出しにより、メインスレッドが終了した後もすべての子が実行され続けることが保証されます。このリンクを参照してください。ただし、終了する前に子スレッドを待機する最も安全な方法は、を使用することpthread_joinです。
それにもかかわらず、それexit(0)自体がプロセスの優雅なリターンです。
あなたはマルチスレッドプログラムを持っていると私たちに言うのを見逃していると思います。プログラムを正常に終了するという考えは、フラグなどを設定してすべてのスレッドを終了することを意味していると思います。そして、mainすべてのスレッドが確実に終了した後にのみ、を終了します。実際に終了する方法mainはそれほど重要ではありません。
exit(0)通常、プロセス(プログラム)が正常に終了したことを示します。エラーの場合は、exit(-1)エラーコードまたはその他のエラーコードが表示されます。
彼らが優雅に何を意味するのか分かりませんが、私の最初のアイデアはただのリターン0でした。
またはexit(0)
私のコメントを参照してください。
mainステートメントがない場合、デフォルトで0を返します。return 0;
C99標準の§5.1.2.2.3¶1を参照してください。
関数の戻り型がと
main互換性のある型である場合、関数intへの最初の呼び出しからの戻りは、関数によって返された値を引数として関数mainを呼び出すことと同じです。関数を終了する に達すると、値が返されます。戻りタイプがと互換性がない場合、ホスト環境に返される終了ステータスは指定されていません。exitmain}main0int
exitしたがって、以下は、明示的またはreturnで区別されて、暗黙的にではありますが、正常に終了しmainます。
main() { }
それらは、低レベルのルーチンでエラーを処理する方法を参照している可能性があります。のようなことをするのではなく
printf("ERROR: couldn't initialize the claveman\n");
exit(1);
そのルーチンから戻ります(おそらく、そのレベルでエラーメッセージを出力するか、main()のようなより高いレベルでそれを実行するのを待っています)。
return CLAVEMAN_INITIALIZE_ERROR;
mainのコードがEXIT_SUCCESSまたは失敗を示すエラーコードのいずれかを返すことができるまで、すべてのルーチンは成功またはゼロ以外のエラーコードに対してゼロを返します。