0

下面的代码显示了我尝试在start_routine没有完成的时间内取消线程ts,并加入线程以确保线程终止。我在一个简单的函数 forstart_routineres2return上使用了它PTHREAD_CANCELED。但是,我尝试使用这种方法来调用第三方库start_routine,但这并没有返回PTHREAD_CANCELED(即我得到“pthread is terminate due to xxx?”)。

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