繁体   English   中英

C++ 析构函数和 PTHREAD_CANCEL_ASYNCHRONOUS

[英]C++ destructors and PTHREAD_CANCEL_ASYNCHRONOUS

如果异步取消线程,是否保证自动对象的析构函数执行?

你的问题格式不正确。 C++0x 之前的标准 C++ 中没有“线程”,C++0x 中也没有异步取消线程。 因此,除了您碰巧使用的特定 C++ 和 pthreads 实现之外,您的问题没有答案。

也就是说,您实施的答案可能是“否”。 (至少,我不知道答案是肯定的任何实现。)

[编辑]

好的,所以我的知识已经过时了。 在 Linux 上,至少使用现代线程库,堆栈通常是展开的(根据@Roddy 的回答)。

但是,任何标准都不能保证这种行为仍然是正确的。

从技术上讲,我认为这是一个实现质量问题:C++ 标准不涉及 POSIX 线程,而 POSIX 线程标准是一种 C 语言绑定,不涉及 C++。

因此,原则上,C++ 实现可以使这项工作(它甚至可以保证)。 在实践中,如果它与延迟或异步取消一起工作,我会感到惊讶。

从理论上讲,它应该可以正常工作,但值得在您的平台上进行测试。

取消线程最终会调用pthread_exit() ,据我从谷歌搜索可知,它将调用析构函数。 它通过将某种“保证未捕获”异常一直抛出到线程包装器来实现这一点,因此所有基于堆栈的对象都以正确的顺序被破坏。

例如,请参阅此页面 这篇博文

在 C++ 中调用 pthread_exit() 时,它必须销毁所有已在堆栈上创建的对象。 这个过程称为堆栈展开,这正是您抛出异常时发生的情况。 pthread_exit() 利用 C++ 的这一特性在永久关闭线程之前进行清理。

为此 pthread_exit() 会抛出一些模糊的异常并在放弃线程之前捕获它。 这样它就可以很好地清理所有对象。 另一方面,捕捉……变得不可能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM