標頭檔案
#include
ucontext
結構體
typedef
struct ucontext
ucontext_t;
操作ucontext
的四個函式
getcontext() : 獲取當前context
setcontext() : 切換到指定context
makecontext() : 設定 函式指標 和 堆疊 到對應context儲存的sp和pc暫存器中,呼叫之前要先呼叫 getcontext()
swapcontext() : 儲存當前context,並且切換到指定context
**如下
int
main()
printf
("done: %d\n"
, done++);
swapcontext
(&main,
&ctx)
;//儲存當前上下文`main`,並且切換到指定`ctx`
printf
("return 1\n");
return1;
}
具體步驟如下:
輸出如下:
done: 1
done: 2
done: 3
done: 4
done: 5
ctx done
return 1
步驟如下:
上下文切換已經做了標記,**如下:
#include
#include
#include
#include
#include
#define stack_size (1024*1024)
struct args
;void
product
(void
*arg)
a->send =0;
printf
("send is 0: %d\n"
, a->n++);
swapcontext
(a->ctx, a->main_ctx)
;//標記2,儲存當前上下文到a->ctx, 切換到a->main_ctx, 跳轉到標記4
}void
customer
(void
*arg)
}int
main()
編譯,執行,輸出如下:
$ gcc -g -wall -o procus procus.c
$ ./procus
a->n: 1
n: 2
a->n: 2
n: 3
a->n: 3
n: 4
a->n: 4
n: 5
send is 0: 5
finally return
協程巢狀協程
import asyncio import functools 第三層協程 async def test1 print 我是test1 await asyncio.sleep 1 print test1已經睡了1秒 await asyncio.sleep 3 print test1又睡了3秒 ret...
構建C協程之ucontext篇
所謂 ucontext 機制是 gnu c 庫提供的一組用於建立 儲存 切換使用者態執行 上下文 context 的api,可以看作是 setjmp long jmp 的 公升級版 主要包括以下四個函式 void makecontext ucontext t ucp void func intarg...
協程(一)原理
賴勇浩 協程,又稱微執行緒和纖程等,據說源於 simula 和 modula 2 語言 我沒有深究,有錯請指正 現代程式語言基本上都有支援,比如 lua ruby 和最新的 google go,當然也還有最近很讓我驚豔的 falcon。協程是使用者空間執行緒,作業系統其存在一無所知,所以需要使用者自...