c語言 setjmp和longjmp 實現協執行緒

2021-07-09 15:23:09 字數 1240 閱讀 5936

非區域性跳轉語句---setjmp和longjmp函式。

非區域性指的是,這不是由普通c語言goto,語句在乙個函式內實施的跳轉,而是在棧上跳過若干呼叫幀,返回到當前函式呼叫路徑上的某乙個函式中。

#include

int setjmp(jmp_buf  env);

返回值:若直接呼叫則返回0,若從longjmp呼叫返回則返回非0值

void longjmp(jmp_buf env,int val);

在希望返回到的位置呼叫setjmp,此位置在main函式中,因為直接呼叫該函式,所以其返回值為0.setjmp引數evn的型別是乙個特殊的型別jmp_buf,這一資料型別是某種形式的陣列,其中存放在呼叫longjmp時能用來恢復棧狀態的所有資訊。因為需要在另乙個函式中引用env變數,所以規範的處理方式是將env變數定義為全域性變數。

當檢查到乙個錯誤時,則以兩個引數呼叫longjmp函式,第乙個就是在呼叫setjmp時所用的env,第二個引數是具有非0值的val,它將成為從setjmp處返回的值。使用第二個引數的原因是對於乙個setjmp可以有多個longjmp

例子:

#include #include #include #include typedef struct context;

static void task0(void* arg)

static void task1(void* arg)

static void task2(void* arg)

static context *task;

static int run_index=0;

static int index=0;

static int count = 0;

static void run(context* c)

void taskinit(int size)

void createtask(void (*start)(void*), void* arg)

index++;

}void start()

int main()

上面有個問題:明明只建立了2個任務,結果加了好幾個都沒報記憶體錯誤。我就奇怪了。不知道原因,有知道的請指教

上面只是簡單的例子,可以用佇列對不同的任務進行管理。有不足請包涵。

C語言中的setjmp和longjmp

在c語言中,goto語句只能在乙個函式內實現跳轉,而不能在函式間進行跳轉。如果希望在函式間跳轉,可以使用 setjmp 和 longjmp 函式。linux 會把程序的上下文儲存在 task struct 結構體中,切換時直接恢復。而 setjmp 和 longjmp 的原理也差不多 第一次呼叫se...

C語言中的setjmp和longjmp函式

c語言的setjmp 異常處理與構建協作式多工系統 int setjmp jmp buf envbuf 巨集函式setjmp 在緩衝區envbuf中儲存系統堆疊裡的內容,供longjmp 以後使用,setjmp 必須使用標頭檔案setjmp.h。呼叫setjmp 巨集時,返回值為0,然而longjm...

c語言中的setjmp和longjmp簡介

setjmp將當前程式的執行環境儲存在乙個jump buf型別的全域性變數中 因為後續要被longjmp呼叫 第一次呼叫setjmp的返回值是null 中後續的 中執行到longjmp以後,longjmp需要兩個引數,乙個是之前setjmp儲存到執行環境的全域性變數可以調整到setjmp函式 另乙個...