これによると
「ただし、スレッドが を呼び出す場合pthread_exit
、C++ は、スレッドのスタック上のすべての自動変数に対してデストラクタが呼び出されることを保証しません。この機能を回復する賢い方法は、特別な例外をスローして、スレッド関数のトップ レベルで pthread_exit を呼び出すことです。 "。
これに続いて、この付随するコードが続きます
class ThreadExitException
{
public:
ThreadExitException (void* return_value)
: thread_return_value_ (return_value) { }
void* DoThreadExit ()
{
pthread_exit (thread_return_value_);
}
private:
void* thread_return_value_;
};
void do_some_work ()
{
while (1)
{
/* Do some useful things here...*/
if (should_exit_thread_immediately ())
throw ThreadExitException (/* thread’s return value = */ NULL);
}
}
void* thread_function (void*)
{
try
{
do_some_work ();
}
catch (ThreadExitException ex)
{
ex.DoThreadExit ();
}
return NULL;
}
私が理解していることから... pthread_exit が呼び出された場合、スタックのすべての自動変数のデストラクタが呼び出されない可能性があります。そのため、例外処理を使用して、すべての変数に対して確実にデストラクタが呼び出されるようにします。(説明から引用: 「pthread_exit を直接呼び出す代わりに ThreadExitException をスローすることにより、例外はトップレベルのスレッド関数でキャッチされ、スレッドのスタック上のすべてのローカル変数は、例外が浸透するにつれて適切に破棄されます。」
のマニュアルページによるとpthread_exit
「まだポップされていない pthread_cleanup_push(3) によって確立されたすべてのクリーンアップ ハンドラは、(プッシュされた順序の逆で) ポップされ、実行されます。 スレッドにスレッド固有のデータがある場合、その後、クリーンアップ ハンドラが実行され、対応するデストラクタ関数が不特定の順序で呼び出されます。
これは、デストラクタが関数に対して呼び出されることを示しているため、自動変数は解放されますか?. では、コードで示されているように、なぜ例外処理を使用する必要があるのでしょうか?