有没有办法让 pthread 在收到取消请求后做某些事情?

Is there a way for a pthread to do certain things after it receives the cancellation request?

如果我在主线程中调用 pthread_cancel(pid);,并在工作线程中设置 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); pthread_setcanceltype(PTHREAD_CANCEL_???); 我希望工作线程仅在收到取消请求后才做某事(例如,跳出 while 循环)。 在 C 中有可能吗? 谢谢。

我认为您是在询问有关设置线程以响应取消请求的问题,但以某种方式而不是终止。不,这是不可能的。关于取消,您(只有)这些选项:

  • 线程是否可以完全取消(其取消状态 属性)。线程可以自行切换它,它的工作方式类似于信号掩码:指向(然后)不可取消线程的取消请求保持挂起状态,直到线程使自身可取消为止。

  • 线程是否可以异步取消(这样取消请求可以在线程执行的任何时刻影响线程)或者是否只能在取消点执行取消请求。

这些严格来说是关于情况,在这些情况下取消请求会被执行。针对正在执行的给定线程的取消请求的效果始终是该线程被提前终止(被取消)。

你永远不应该这样做,因为它很可能使程序处于不一致的状态。

听起来您可能正在寻找 pthread_kill(),您可以使用它向线程传递选定的信号。您可以注册一个信号处理函数,该函数将在收到此类信号时调用。这也可以中断系统调用,尽管有一些会在处理信号后自动恢复。

或者,可能有其他方法更适合您的具体情况,但这些方法与线程取消行为相去甚远。