libco協程示例-多協程任務代碼(類似多線程)

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

從執行結果可以看出,各個協程分別啓動,並因爲隨機超時使得多個協程隨機執行並打印相應信息,因此我們可以看到使用協程可以達到併發效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章