c - posix 线程中的线程取消

标签 c multithreading posix

我正在使用 posix 线程 我的问题是一个线程是否可以通过在 pthread_cancel 函数中传递它自己的线程 ID 来取消它自己? 如果是那么它的含义是什么

如果主程序创建了两个线程,其中一个线程取消了另一个线程,那么返回值和被取消线程的资源会发生什么 以及如何从主程序中知道哪个线程被取消了..因为主程序没有取消任何线程

我正在使用异步取消

请帮忙

最佳答案

Q1:是的,一个线程可以取消它自己。但是,这样做一般会产生取消的所有负面后果;你可能想使用 pthread_exit 相反,这更容易预测。

Q2:当一个线程被取消后,它没有生成返回值;相反, pthread_join 将把特殊值 PTHREAD_CANCELED在其 retval 指向的位置争论。不幸的是,在调用 pthread_join 之前,您必须通过其他方式知道特定线程已明确终止(以某种方式)。 ,否则调用线程将永远阻塞。没有 waitpid(..., WNOHANG) 的可移植等价物也不是 waitpid(-1, ...) . (联机帮助页上说“如果您认为您需要此功能,您可能需要重新考虑您的应用程序设计”,这让我想打某人的脸。)

Q2a:这取决于您所说的“线程资源”是什么意思。线程控制 block 和堆栈将被释放。所有在 pthread_cleanup_push 注册的析构函数或 pthread_key_create 将被执行(在线程上,在它终止之前);一些运行时还为堆栈上的对象执行 C++ 类析构函数。应用程序程序员有责任确保线程拥有的所有资源都被这些机制之一覆盖。请注意,其中一些机制具有固有的竞争条件;例如,不可能打开一个文件并推送一个关闭它的清理作为一个原子操作,所以有一个窗口,取消可以泄漏打开的文件。 (不要认为这可以通过在打开文件之前推送清理来解决,因为延迟取消的常见实现是在系统调用返回时检查它们,即恰好在操作系统将文件描述符编号写入返回值寄存器与调用函数将该寄存器复制到清理预期的内存位置之间的微小间隙。)

Qi:你没有问这个,但你应该知道启用了异步取消的线程除了纯计算之外,官方不允许任何。如果它调用除pthread_cancel 之外的任何 库函数,则行为未定义。 , pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED) , 或 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE) .

关于c - posix 线程中的线程取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19387873/

相关文章:

c - 使用设置的方法有哪些

c# - 如果线程花费太长时间,如何停止线程

c++ - 多类中的多线程

c++ - pthread_join 的段错误

c - 在启动时暂停 fork 进程

c - 关于 struct 内存分配机制的一些困惑?

c - 将指针传递给 C 中的函数

c - 用于静态代码分析的稀疏和覆盖工具有何不同?

multithreading - 基于Windows Phone 8的线程

c++ - 如何在超时内从另一个线程唤醒 select()