0

start_routine次のコードは、 が時間内に完了しない場合にスレッドをキャンセルし、スレッドにts参加してスレッドが確実に終了するようにすることを示しています。これを単純な関数 for start_routineand res2returnsで使用しました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

4

0 に答える 0