協程是用戶態輕量級線程,由程序員控制調度(同步串行),而非操作系統搶佔式調度。核心優勢:
| 特性 | Windows Fiber | Linux ucontext |
|---|---|---|
| 核心 API | ConvertThreadToFiberEx / CreateFiberEx / SwitchToFiber | getcontext / makecontext / swapcontext |
| 棧管理 | 系統自動分配 | 用戶手動分配 uc_stack |
| 上下文傳遞 | LPVOID 參數 + GetFiberData() | makecontext 可變參數 |
| 64 位參數傳遞 | 原生支援 | 需拆分高低 32 位組合 |
typedef enum { CS_Dead, CS_Ready, CS_Running, CS_Suspend } costatus_e;
typedef struct comng * comng_t;
typedef void (*co_f)(comng_t, void *);
comng_t co_start(void); // 初始化調度器
void co_close(comng_t); // 銷毀調度器
int co_create(comng_t, co_f, void *); // 創建協程,返回 ID
void co_resume(comng_t, int); // 恢復/啟動協程
void co_yield(comng_t); // 主動讓出 CPU
costatus_e co_status(comng_t, int); // 查詢狀態
int co_running(comng_t); // 獲取當前運行協程 ID
ConvertThreadToFiberEx 轉為 FiberCreateFiberEx 創建子協程,指定入口函數 _comainSwitchToFiber 實現雙向切換,GetCurrentFiber 保存當前上下文DeleteFiber 釋放資源,ConvertFiberToThread 恢復線程模式comng::stack,協程各自備份棧內容 coroutine::stackmakecontext 64 位參數傳遞技巧:將指針拆分高低 32 位分兩個參數傳入,入口函數重組swapcontext 切換前後需手動保存/恢復棧內容(_save_stack / memcpy)通過 #if defined(__GNUC__) / #elif defined(_MSC_VER) 實現單文件跨平台編譯。測試用例創建兩個協程交替打印計數器,雙平台輸出一致:
coroutine 0 : 0
coroutine 1 : 100
coroutine 0 : 1
coroutine 1 : 101
...
main end
coroutine.h(接口)、coroutine.c(融合實現)本庫採用純 C 實現,無 C++ 依賴,極易集成到嵌入式、遊戲服務器、高性能網關等項目中。