windows 纖程 fiber 實現的協程

2021-07-26 02:41:27 字數 2267 閱讀 1311

參考雲風的協程庫實現:

雲風的協程為 非對稱的共享棧協程

以下為fiber實現的非對稱協程:

環境:win7、vs2013

標頭檔案: (coroutine.h)

#ifndef __coroutine__h__

#define __coroutine__h__

#define coroutine_dead 0

#define coroutine_ready 1

#define coroutine_running 2

#define coroutine_suspend 3

typedef struct schedule schedule;

typedef void(*coroutine_func)(schedule *s, void *ud);

schedule *coroutine_open();

void coroutine_close(schedule *s);

int coroutine_new(schedule *s, coroutine_func *, void *ud);

void coroutine_resume(schedule *s, int id);

void coroutine_yield(schedule *s);

int coroutine_status(schedule *s, int id);

int coroutine_running(schedule *s);

#endif

原始檔:(coroutine.c)

#include #include #include #include #include "coroutine.h"

/* windows fiber版本的協程yield的時候直接切換到主協程(main),

而不是swapcontext的切換到上次執行協程,但最後達到的結果卻一樣

*/// 預設容量

#define default_cap 8

// 堆疊大小

#define init_stack 1048576 //(1024*1024)

typedef struct schedule schedule;

typedef struct coroutine coroutine;

typedef struct coroutine_para coroutine_para;

struct schedule

;struct coroutine

;static int co_putin(schedule *s, coroutine *co)

else

}} assert(0);

return -1;

}static void co_delete(coroutine *co)

schedule *coroutine_open()

void coroutine_close(schedule *s)

free(s->co);

s->co = null;

free(s);

}void __stdcall coroutine_main(lpvoid lpparameter)

int coroutine_new(schedule *s, coroutine_func *func, void *ud)

void coroutine_resume(schedule *s, int id)

}void coroutine_yield(schedule *s)

int coroutine_status(schedule *s, int id)

return s->co[id]->status;

}int coroutine_running(schedule *s)

測試程式:(main.c)

#include "coroutine.h"

void test3(schedule *s, void *ud)

}void coroutine_test()

int id3 = coroutine_new(s, test3, &a);

while (coroutine_status(s, id3))

printf("coroutine_test3 end\n");

coroutine_close(s);

}int main()

Windows 纖程 協程

寫這篇文章的原因是,很多框架 庫都有協程 纖程的支援,比如python的gevent,php 的swoole等等,但是具體是什麼樣的呢?為什麼協程方式效能會更好?很多初學者聽個詞,聽風就是雨,把協程和io能混成乙個概念。使用纖程的第乙個步驟是將已有的執行緒轉換為乙個纖程。convertthreadt...

纖程排程器

indy的纖程排程器排程纖程們到乙個或多個執行緒中去。纖程儲存工作專案 到乙個工作序列中然後等待。當纖程的工作專案被完成後,排程器把纖程放到乙個可以被調 度的纖程列表中。作業系統時間排程器以一種智慧型的方式排程執行緒,但是由於在系統的所有任務間每個執行緒都 是普通和泛型的 generic 它們對執行...

windows下socket開發udp程式

以下 均在vc6.0上除錯通過。伺服器端 udp server listen port 9102 receive string and display it visual c 6.0 include include pragma comment lib,ws2 32.lib define bufle...