2011-08-28 145 views
2

为什么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; 
} 

我除了是代码将跳转从主来回功能,每次回来印刷越来越多。
实际发生的是它无限次地打印0然后1。就好像它跳回到函数栈中重置为默认值一样。它为什么这样做?有什么办法可以让它保存堆栈吗?
我知道setjmplongjmp在编码风格和可读代码方面比goto更差,但我现在正在试验,而且这段代码可能永远不会看到可用应用程序的灯光。

回答

2

因为不幸的是,那不是setjmp如何工作。 setjmp将当前指令指针和寄存器组拷贝到跳转缓冲区中,但它不会复制堆栈(显然会导致堆栈很大)。看起来你想使用某种基于协程的技术。如果你想自己做这个检查ucontext procedured(ucontext.h)http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?ucontext.h+3他们将帮助你分配和管理additionaly线程堆栈。

或者你可以使用像Russ Cox的libtask(http://swtch.com/libtask/)这样可以帮助你做到这一点。或者如果你想自己做,你应该看看libtask代码(也可以通过该链接获得)。它很容易阅读,所以它是一个很好的资源。

相关问题