posix线程中的线程取消

时间:2013-10-15 17:56:07

标签: c multithreading posix

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

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

我正在使用异步取消

请帮助

3 个答案:

答案 0 :(得分:7)

Q1:是的,线程可以自行取消。但是,这样做会导致一般取消的所有负面后果;你可能想要使用pthread_exit,这有点更容易预测。

Q2:当线程被取消时,它不会产生返回值;相反,pthread_join会将特殊值PTHREAD_CANCELED放在其retval参数指向的位置。不幸的是,在调用pthread_join之前,你必须通过其他方式知道特定线程肯定终止(以某种方式),否则调用线程将永远阻塞。没有waitpid(..., WNOHANG)waitpid(-1, ...)的便携式等效项。 (该联机帮助页说“如果您认为自己需要此功能,则可能需要重新考虑您的应用程序设计”,这使我想要打击某人。)

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

Qi:你没有问这个问题,但你应该知道,除了纯计算之外,官方不允许启用异步取消的线程执行任何。如果行为调用除<{1}},pthread_cancelpthread_setcanceltype(PTHREAD_CANCEL_DEFERRED)之外的任何库函数,则行为未定义。

答案 1 :(得分:1)

Q1。是的,线程可以自行取消。

Q2。如果一个线程取消另一个线程,它的资源就会挂起,直到主线程     使用pthread_join()函数连接该线程(如果线程可连接)。如果取消了     线程未加入主线程资源是免费的,程序结束/终止。

Q3。我不确定,但主程序不知道哪个线程被取消了。

答案 2 :(得分:0)

线程可以取消包括其自身在内的任何其他线程(在同一进程内)

线程没有返回值(一般来说,它们只能返回状态),线程的资源将在取消时释放

主程序可以存储线程的处理程序并测试它是否有效