有几个问题讨论了线程取消点(cancel.3.html)。在某些情况下,答复者说,除非程序员知道他们做的很好,否则不应该使用取消点。
我的问题
从评论中更新
发布于 2014-04-22 14:26:39
取消点允许那些特定的API调用被取消吗?
坚持使用PTHREAD_CANCEL_DEFERRED,这可能是混乱的中心。你几乎把它想反了。取消点不允许系统调用(命名中的API)被取消,调用检查取消请求是否挂起。从概念上来说,您可以认为这是(手动)设置开关。自动取消点将检查它是否有效,可以在方便或其他必要的地方插入对pthread_testcancel的故意调用--例如,在长时间运行的计算循环中,可能不会有其他可取消的系统调用。取消点会自动强制调用任何已设置且可以以类似于atexit调用的方式链接的线程清理处理程序。
很多人选择(如果对他们的情况可行的话)设置自己的开关,并在检查开关时在线程的那个点编写关闭线程的方法。PTHREAD_CANCEL_DEFERRED基本上就是用类固醇。它提供了(潜在的)几个点,其中的开关在概念上是检查的,因此也迫使开发人员考虑在这些点中的每个点被取消的影响。
为什么是那些而不是其他人?
您需要通过呼叫来讨论这个问题,但主要是因为无法预测的副作用。
您想要在用户级代码中还是仅在API中使用取消点?
是的,您希望在用户级代码中使用它们。作为程序员,您最好知道您正在使用哪些资源,以及在线程被取消时如何清理它们,以及在任何给定的点上取消这些资源的逻辑含义。
PTHREAD_CANCEL_ASYNCHRONOUS是另一个蜡球和它自己的噩梦。从概念上讲,您几乎可以认为这是一个被kill信号触发的线程--它可以在任何地方被中断--但是它确实为清理处理程序提供了运行的机会。问题是,要做到这一点真的很难,例如,如果它在malloc中间被取消了怎么办?这使得它在一些真的,真的,仔细考虑过的情况之外几乎毫无用处。
发布于 2014-04-22 14:00:44
..。线程取消点的用途是什么?
来自man 7 pthreads
取消点 POSIX.1指定某些函数必须是取消点,而某些其他函数可能是取消点。
更多信息:
如果一个线程是可取消的,那么它的可取消性类型就会被推迟,并且该线程的取消请求被挂起,那么当它调用一个作为取消点的函数时,该线程就会被取消。
关于这些问题:
pthread_testcancel()。最后,请注意:尽可能避免取消线程,因为这可能导致程序的意外和不可复制的行为。尝试始终设计一个程序,以便能够通过结束所有线程而不显式调用pthread_cancel()来优雅地关闭它。
https://stackoverflow.com/questions/23220206
复制相似问题