C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了是否有任何方法导致整个堆栈帧在C中展开? (除了使用例外)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在写一个延续 – 特定的,协程 – 库.它类似于std :: thread(除了它是合作的) – 每个执行上下文都在conTinuation对象中表示.

问题是关于持续对象的破坏.如果在执行上下文没有正常退出调用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 11之后提出协程(或对corountines支持)(在Going Native会议期间谈到).

您将不得不使用特定于操作系统的C调用(如果存在,我不这么认为),但很可能您自己使用ASm.您可以查看boost.context库以获取示例解决方案.

大佬总结

以上是大佬教程为你收集整理的是否有任何方法导致整个堆栈帧在C中展开? (除了使用例外)全部内容,希望文章能够帮你解决是否有任何方法导致整个堆栈帧在C中展开? (除了使用例外)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。