下面的代码显示了我尝试在start_routine
没有完成的时间内取消线程ts
,并加入线程以确保线程终止。我在一个简单的函数 forstart_routine
和res2
return上使用了它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
)。