c uconcontext h實現協程

2022-07-30 14:54:12 字數 1470 閱讀 2368

目錄協程是一種程式元件,是由子例程(過程、函式、例程、方法、子程式)的概念泛化而來的,子例程只有乙個入口點且只返回一次,而協程允許多個入口點,可以在指定位置掛起和恢復執行。

協程擁有自己的暫存器上下文和棧。協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧。

乙個執行緒可以擁有多個協程,但是乙個時刻只能有協程在執行,協程的排程是非強佔式的,只有協程自己主動讓出執行權才切換。而非像執行緒一樣是由作業系統排程。

實現協程的重點就是儲存當前上下文,切換到要執行的上下文,結束後再返回到儲存的上下文

ucontext.h庫中定義了乙個ucontext_t結構體

typedef struct ucontext_t

ucontext_t;

這個結構體是用來儲存上下文的

並且定義了4個函式用於操作結構體

int getcontext(ucontext_t * ucp);

獲取當前上下文, 初始化ucp結構體, 將當前上下文儲存到ucp中

void makecontext(ucontext_t *ucp, void(*func)(), int argc, ...);

建立乙個上下文

int setcontext(const ucontext_t *ucp);

設定當前的上下文為ucp

int swapcontext(ucontext_t *oucp, ucontext_t *ucp);

儲存當前上下文至oucp, 啟用ucp上下文

#include#includevoid funtion()

int main()

output

in main

run this

in main

核心**

ucontext_t main,other;

getcontext(&main); //獲取當前上下文

main.uc_stack.ss_sp = stack; //指定棧空間

main.uc_stack.ss_size = sizeof(stack);//指定棧空間大小

main.uc_stack.ss_flags = 0;

main.uc_link = &other; //將後繼上下文指向other

makecontext(&main,funtion,0); //為main指定要執行的函式

swapcontext(&other,&main); //啟用main,並將當前上下文儲存到other

快速排序演算法實現(遞迴實現 棧實現)

基本思想 選擇乙個基準元素,比如選擇最後乙個元素,通過一趟掃瞄,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素,此時基準元素在其排好序後的正確位置,又稱為軸位置,此位置的元素確定後不再參與排序,然後再用同樣的方法遞迴地排序劃分的兩部分。分析 快速排序是不穩定的排序。快速排序的時間複...

介面實現與配置實現

在實現系統功能的時候,通常會首先定義好功能的介面,在系統功能不斷被實現的過程中,慢慢的發現有些介面的實現很類似,這個時候通常會開始做一次抽象,形 成乙個共同的部分,慢慢的系統形成了乙個抽象的層次,而為了通用,通常是通過定義介面,形成乙個抽象類,抽象類中暴露出一些抽象方法供外部擴充套件實 現,逐步的積...

js分頁實現,前端實現。

主要是借鑑了網上乙個例子,自己重新加了樣式,新增了跳轉,修改了一些小地方,用於和大家一起分享,前端分頁的技巧,的資料是我已經寫好了,其實大家也可以前端渲染 然後再分頁,都是可以的。其實分頁最關鍵是這兩句 var startrow currentpage 1 pagesize 1 currentpag...