協程解析一 ucontext

2021-10-21 13:39:38 字數 1571 閱讀 5623

標頭檔案

#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。協程是使用者空間執行緒,作業系統其存在一無所知,所以需要使用者自...