libco協程示例-多協程任務代碼(類似多線程)
簡介
在我們平常的工作及測試過程中,涉及到多個任務並行工作時我們一般會考慮使用多線程方案,多線程的方案方便我們在同一個程序中並行執行多個任務,不僅可以一心多用
,而且還可以有效地提升機器的使用效率。
考慮到協程是一種更輕量級的多任務並行方案,因此我們在遇到允許使用多線程的時候不妨停下來想想,是不是可以使用協程替代線程,從而達到相同的效果。
本文根據libco
的示例代碼,摘出使用協程實現多任務並行的代碼,學習如何使用協程實現多任務。
案例
本示例使用最簡單的方式以展示協程的多任務併發效果:在主線程中啓動多個協程,每個協程共用相同協程任務方案,分別隨機超時向屏幕輸出信息,如果可以看到各個協程隨機顯示信息,則說明我們的協程併發有效,具體實現過程下面一一描述。
協程參數
首先我們定義一個結構體,用於記錄協程參數及其他信息,如下所示:
// 協程參數
struct stPara_t
{
// 自定義的協程id,定位運行的協程身份
int cid;
};
創建協程任務函數
接着,我們模擬實現協程工作任務,隨機超時輸出信息,如下所示:
// 啓用協程HOOK項
co_enable_hook_sys();
// 協程工作區
stPara_t* p = (stPara_t *)para;
while (true)
{
printf("[%02d] it's my turn\n", p->cid);
poll(NULL, 0, (rand()%10+1)*1000);
}
創建並啓動多個協程
最後,我們創建並啓動多個協程,使用協程參數標識協程對象,方便信息輸出時定位相對應的協程對象,如下所示:
// 創建並啓動多個協程
for (int i=0; i<4; i++)
{
stPara_t*p = new stPara_t();
stCoRoutine_t* pCo;
p->cid = i;
co_create(&pCo, NULL, loop, p);
co_resume(pCo);
}
// 啓動循環事件
co_eventloop(co_get_epoll_ct(), NULL, NULL);
完整代碼
#include "co_routine.h"
#include <stdio.h>
#include <stdlib.h>
// 協程參數
struct stPara_t
{
// 自定義的協程id,定位運行的協程身份
int cid;
};
void* loop(void* para)
{
// 啓用協程HOOK項
co_enable_hook_sys();
// 協程工作區
stPara_t* p = (stPara_t *)para;
while (true)
{
printf("[%02d] it's my turn\n", p->cid);
poll(NULL, 0, (rand()%10+1)*1000);
}
return 0;
}
void* work()
{
// 創建並啓動多個協程
for (int i=0; i<4; i++)
{
stPara_t*p = new stPara_t();
stCoRoutine_t* pCo;
p->cid = i;
co_create(&pCo, NULL, loop, p);
co_resume(pCo);
}
// 啓動循環事件
co_eventloop(co_get_epoll_ct(), NULL, NULL);
return 0;
}
int main(int argc, char* argv[])
{
work();
return 0;
}
執行結果輸出
[00] it's my turn
[01] it's my turn
[02] it's my turn
[03] it's my turn
[00] it's my turn
[03] it's my turn
[01] it's my turn
[00] it's my turn
[02] it's my turn
[00] it's my turn
[03] it's my turn
[00] it's my turn
[01] it's my turn
[01] it's my turn
從執行結果可以看出,各個協程分別啓動,並因爲隨機超時使得多個協程隨機執行並打印相應信息,因此我們可以看到使用協程可以達到併發效果