c++ - 为什么 setjmp 不保存堆栈?

标签 c++ setjmp

为什么 setjmp 不保存堆栈?
考虑以下代码:

#include <iostream>

jmp_buf Buf;
jmp_buf Buf2;

void MyFunction()
{
    for(int i = 0; i < 5; i++)
    {
        std::cout << i << std::endl;
        if(!setjmp(Buf))
            longjmp(Buf2, 1);
    }
}

int main (int argc, const char * argv[])
{
    while(true)
    {
        if(!setjmp(Buf2))
        {
            MyFunction();
            break;
        }
        longjmp(Buf, 1);
    }
    return 0;
}

我除了代码会在 main 函数和函数之间来回跳转,每次都打印递增的数字。
实际发生的是它无限次打印 0 然后 1。就好像当它跳回函数时,堆栈被重置为默认值。为什么要这样做?有什么方法可以让它也保存堆栈吗?
我知道 setjmplongjmp 在编码风格和可读代码方面甚至比 goto 更糟糕,但我现在正在试验,这个代码可能永远看不到可用应用程序的光芒。

最佳答案

因为不幸的是,这不是 setjmp 的工作原理。 setjmp 将当前指令指针和寄存器集复制到跳转缓冲区中,但不复制堆栈(显然是因为堆栈很大)。看起来您想使用某种基于协程的技术。如果您想自己执行此操作,请查看 ucontext 程序 (ucontext.h) http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?ucontext.h+3它们将帮助您分配和管理额外的线程堆栈。

或者您可以使用类似 Russ Cox 的 libtask (http://swtch.com/libtask/) 之类的工具来帮助您完成这项工作。或者,如果您想自己做,您应该查看 libtask 代码(也可通过该链接获得)。它非常容易阅读,因此是一个很好的资源。

关于c++ - 为什么 setjmp 不保存堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7224358/

相关文章:

c - 在多线程环境中捕获信号

c++ - 将 jmp_buf 声明为指针

c++ - 参数类型与指针/引用不匹配

c++ - 在 C 和 C++ 中,同一个标识符如何用于两个不同的事物?

c++ - '转换': is not a member of 'std'

c++ - 为 unordered_map 定义自定义哈希函数和相等函数

java - java中有没有一种setjmp/longjmp?

c - 两个独立的 jmp_bufs 如何工作?

Objective-C ARC 和 longjmp

c++ - 在 C++ 中定义类指针