线程可以通过调用 pthread_cancel 自毁吗

Can a thread self-destruct by calling pthread_cancel

当旋转一个新线程时,我正在做一些该线程需要消耗的事情。如果出现问题,我想取消或退出该线程。我读到 pthread_exit 不进行资源清理。所以我喜欢坚持 pthread_cancel。问题是我可以在同一线程上调用 pthread_cancel 吗?我知道我可以从其他线程调用 pthread_cancel 但不确定它自己的线程。 (How to kill a running thread?) 最好的方法是什么?

我的代码如下所示。

void* my_thread(){
//do this --> go to failure if fails
//do that --> go to failure if fails
//do this too --> go to failure if fails

while(1){
//will read, write or usleep until data is available 
}

failure:
pthread_cancel(my_thread_id);
}

Question is can I call pthread_cancel on the same thread.

没有针对它的记录限制,因此我希望 pthread_cancel(thread_id) 从 ID 为 thread_id 的线程调用时具有与从任何其他线程调用时相同的效果。

但是,如果线程禁用了取消,“相同的效果”可以是效果,如果线程的取消类型是 PTHREAD_CANCEL_DEFERRED(默认)。要尽可能快地终止线程,您应该:

// ensure that the thread is cancellable
int old_state;
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_state);

// perform the cancellation
pthread_cancel(my_thread_id);

// user-defined cancellation point
pthread_testcancel();

话虽如此,问题似乎是基于一个错误的前提:

I read that pthread_exit does not do resource clean up.

pthread_cancel()pthread_exit() 都是如此。通过这两种方式中的任何一种终止线程都会导致调用任何已注册的取消处理程序,这确实提供了资源清理的途径,但除此之外,process-shared 资源的任何清理也不会。*

线程取消几乎总是错误的做法。线程对自己做的事情尤其错误,因为 pthread_exit() 更干净、更安全、更可靠,并且两者具有相同的清理语义。您确实 必须采取适当的措施来清理资源,但无论哪种方式都是如此。 pthread_cancel() 没有为此提供任何独特的快捷方式。


* 注意:与通过 pthread_cancel()pthread_exit() 终止不同,从 entry-point 函数返回 不会 导致取消处理程序 运行.