libcoコラボレーションの例-マルチコラボレーションタスクコード(マルチスレッド類似)

13242 ワード

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
"
, 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 
#include 

//     
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
"
, 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

実行結果から,各コヒーレンスがそれぞれ起動し,ランダムタイムアウトにより複数のコヒーレンスがランダムに実行され,対応する情報が印刷されるため,コヒーレンスを使用すると同時効果が得られることが分かる.