大佬教程收集整理的这篇文章主要介绍了是否有任何方法导致整个堆栈帧在C中展开? (除了使用例外),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
问题是关于持续对象的破坏.如果在执行上下文没有正常退出时调用conTinuation对象的dtor,则应该强制它被销毁该对象的上下文关闭.
这样,堆栈帧中的每个C对象都不会被正确销毁.对于任何人来说这可能不是一个令人愉快的情况 – 所以我决定找到一个解决方案.
在第一次,我想使用异常来展开堆栈帧,如下所示. (请注意,下面只是有缺陷的伪代码.)
coroutIne::~coroutIne() { status = FORCED_EXIT; switch_to(*this); } void coroutIne::yield(coroutIne& other_coroutInE) { // switch to other context,halt until invocation by other context switch_to(other_coroutInE); if (status_ != FORCED_EXIT) { return; // resume } else { throw ContextClosingException; } } void coroutIne::entrypoint() { try { entry_function_(); } catch(ContextClosingException& E) { switch_to(caller_coroutInE); } }
但是,我发现了一些严重的缺陷.如下所述“吞下异常”的任何用户代码将完全打破协作调度的假设.
try { ... } catch(...) { // ContextClosingException // do nothing,just swallow exception. }
所以我需要找到其他方法来调用堆栈展开(或者在继续中破坏堆栈对象的任何其他方法).标准一致性方式会很好 – 但是延续实现本身依赖于特定于平台的API,因此非可移植方式是可以接受的. (我正在使用win32)
以上是大佬教程为你收集整理的是否有任何方法导致整个堆栈帧在C中展开? (除了使用例外)全部内容,希望文章能够帮你解决是否有任何方法导致整个堆栈帧在C中展开? (除了使用例外)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。