3

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

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

我正在使用异步取消

好心的帮助

4

3 回答 3

7

Q1:是的,线程可以自行取消。但是,这样做通常会带来取消的所有负面后果;您可能想pthread_exit改用它,这更容易预测。

Q2:当一个线程被取消时,它不会产生返回值;相反,pthread_join会将特殊值放在其参数PTHREAD_CANCELED指向的位置。retval不幸的是,您必须通过其他方式知道特定线程在您调用之前肯定已经终止(以某种方式)pthread_join,否则调用线程将永远阻塞。没有与waitpid(..., WNOHANG)或 的可移植等价物waitpid(-1, ...)。(手册页上写着“如果你认为你需要这个功能,你可能需要重新考虑你的应用程序设计”,这让我想打某人的脸。)

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

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

于 2013-10-15T18:22:17.503 回答
1

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

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

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

于 2013-10-16T10:21:37.997 回答
0

thread can cancel any other thread (within the same process) including itself

threads do not have return values (in general way, they can have return status only), resources of the thread will be freed upon cancellation

main program can store thread's handler and test whether it valid or not

于 2013-10-15T17:58:35.377 回答