參考雲風的協程庫實現:
雲風的協程為 非對稱的共享棧協程
以下為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...