以下代码显示我尝试在时间start_routine
内未完成ts
时取消线程,并加入线程以确保线程终止。我在start_routine
和res2
返回PTHREAD_CANCELED
的简单函数上使用了此函数。但是,我尝试使用这种方法在start_routine
中调用第三方库,这不会返回PTHREAD_CANCELED
(即我得到" pthread由于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
)。