(1) C++ コードで return
を使用 スタックが巻き戻され、ローカル変数が破棄されますが、 pthread_exit
pthread_cancel_push()
で登録されたキャンセル ハンドラの呼び出しのみが保証されます .一部のシステムでは、このメカニズムによって C++ ローカル変数のデストラクタも呼び出されますが、これは移植可能なコードでは保証されません --- プラットフォームのドキュメントを確認してください。
また、main()
では 、 return
暗黙的に exit()
を呼び出します 、したがってプログラムを終了しますが、 pthread_exit()
スレッドを終了するだけで、すべてのスレッドが終了するか、一部のスレッドが exit()
を呼び出すまで、プログラムは実行され続けます。 、 abort()
またはプログラムを終了する別の関数。
(2) return
の使用 POSIX仕様がそう言っているので動作します。戻り値は pthread_join()
の場所に格納されます それを取得できます。スレッドによって使用されるリソースは、pthread_join()
まで回収されません。
(3) 生の POSIX スレッドでスレッドの戻り値を使用することはありません。ただし、Boost スレッド ライブラリや、最近では C++0x スレッド ライブラリなどの高レベルの機能を使用する傾向があります。これは、Future などのスレッド間で値を転送するための代替手段を提供し、メモリ管理に関連する問題を回避します。
return
だと思います start_routine
から 呼び出しスタックが適切に巻き戻されることが保証されるため、推奨されます。
これは、C++ よりも C にとってさらに重要です。C には、予備終了後に混乱を解消するデストラクタ マジックがないためです。したがって、コードはコール スタック上のルーチンのすべての最終部分を通過して、free
を実行する必要があります。
なぜこれが機能するのか、これは簡単です
<ブロック引用>start_routine が戻る場合、その効果は、終了ステータスとして start_routine の戻り値を使用して、pthread_exit() への暗黙の呼び出しがあったかのようになります
私の個人的な経験では、終了したスレッドのステータスをあまり使用しない傾向があります。これが、スレッドを開始することが多い理由です detached
.しかし、これはアプリケーションに大きく依存するはずであり、一般化することはできません.