start_routine
次のコードは、 が時間内に完了しない場合にスレッドをキャンセルし、スレッドにts
参加してスレッドが確実に終了するようにすることを示しています。これを単純な関数 for start_routine
and res2
returnsで使用しましたPTHREAD_CANCELED
。ただし、サードパーティのライブラリを呼び出すためにこのアプローチを使用しようとしましたstart_routine
が、返されませんPTHREAD_CANCELED
(つまり、「xxx が原因で pthread が終了しましたか?」というメッセージが表示されました)。
pthread_create(&thread, &attr, start_routine, (void *)&arg);
if (0 != pthread_timedjoin_np(thread, &res1, &ts)
{
if (0 == pthread_cancel(thread))
{
if (0 == pthread_join(thread, &res2))
{
if (PTHREAD_CANCELED == res2)
{
std::cout << "pthread is cancelled" << std::endl;
}
else
{
std::cout << "pthread is terminated due to xxx?" << std::endl;
}
}
}
}
のマンページによるとpthread_join
:
ターゲット スレッドがキャンセルされた場合、PTHREAD_CANCELED が *retval に配置されます。
pthread_join
を使用した場合に返される可能性のある値は何pthread_cancel
ですか? なぜpthread_join
時々返さないのPTHREAD_CANCELED
ですか?
PTHREAD_CANCEL_DEFERRED
デフォルトのキャンセル タイプ (つまり) とキャンセルを有効にする (つまり)を使用したことに注意してくださいPTHREAD_CANCEL_ENABLE
。