GNU/Linux >> Linux の 問題 >  >> Linux

pthread 開始関数での return() と pthread_exit() の比較

(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 .しかし、これはアプリケーションに大きく依存するはずであり、一般化することはできません.


Linux
  1. タイムゾーンで開始時間を処理しますか?

  2. C プログラムでスレッドを終了する方法 ( pthread_exit の例 )

  3. Linuxでスレッドに名前を付ける方法は?

  1. pthread_t を出力する方法

  2. pthread_exit と return

  3. スレッド ID とスレッド ハンドル

  1. 別のTtyでプロセスを開始しますか?

  2. Linux CプログラムでpthreadのスレッドIDを取得するには?

  3. Systemd postgresql 起動スクリプト