なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

C言語でコルーチン(co-routine)(4)

Posted by arms22 on 2008年04月12日 0  0

C言語でコルーチンを実装してみる、その4。今回でコルーチンの連載(?)は最後です。最後にコルーチンを使った協調型スレッドライブラリを実装します。さっそくサンプルコードから見ていきましょう。

int thread1_count=0;
int thread1_func(coroutine_t coro)
{
co_begin(coro);
while(1){
thread1_count++;
co_yield();
}
co_end;
}

int thread2_count=0;
int thread2_func(coroutine_t coro)
{
co_begin(coro);
while(1){
thread2_count++;
co_yield();
}
co_end;
}

int thread3_count=0;
int thread3_func(coroutine_t coro)
{
co_begin(coro);
while(1){
thread3_count++;
co_yield();
}
co_end;
}

int main(int argc, char *argv[])
{
struct cothread_scheduler schdlr;
cothread_t thread1;
cothread_t thread2;
cothread_t thread3;
int thread1_stack[32];
int thread2_stack[32];
int thread3_stack[32];

/* 協調型スレッド作成 */
thread1 = cothread_create(thread1_func,(co_addrword_t)1,
thread1_stack,sizeof(thread1_stack));
thread2 = cothread_create(thread2_func,(co_addrword_t)2,
thread2_stack,sizeof(thread2_stack));
thread3 = cothread_create(thread3_func,(co_addrword_t)3,
thread3_stack,sizeof(thread3_stack));

/* スケジューラ作成 */
cothread_scheduler_init(&schdlr);

/* スレッドアタッチ */
cothread_scheduler_attach(&schdlr,thread1);
cothread_scheduler_attach(&schdlr,thread2);
cothread_scheduler_attach(&schdlr,thread3);

/* 実行 */
cothread_scheduler_run(&schdlr);
printf("thread1_count %d, thread2_count %d, thread3_count %d?n",
thread1_count,thread2_count,thread3_count);
cothread_scheduler_run(&schdlr);
printf("thread1_count %d, thread2_count %d, thread3_count %d?n",
thread1_count,thread2_count,thread3_count);
cothread_scheduler_run(&schdlr);
printf("thread1_count %d, thread2_count %d, thread3_count %d?n",
thread1_count,thread2_count,thread3_count);
}
実行結果は次のとおり。
% a.exe
thread1_count 1, thread2_count 1, thread3_count 1
thread1_count 2, thread2_count 2, thread3_count 2
thread1_count 3, thread2_count 3, thread3_count 3
コルーチン関数の書き方は何も変わっていない。コルーチンの作成関数が協調型スレッドの作成関数に置き換わっているのがわかる。順番に見ていこう。
  • cothread_create()
    協調型スレッドの作成関数だ。内部でco_create関数を呼び出す。引数はco_create関数と同じだ。第1引数にコルーチン関数のアドレスを渡す。戻り値としてcothread_t型にキャストしたスタックのアドレスを返す。
  • cothread_scheduler_init()
    スレッドスケジューラの初期化関数だ。スケジューラの初期化を行う。今回実装したスケジューラはアタッチされたスレッドを順番に実行するラウンドロビン方式を採用している。
  • cothread_scheduler_attach()
    スケジューラにスレッドをアタッチする関数だ。
  • cothread_scheduler_run()
    アタッチされたスレッドを1つ1つ実行する。すべてのスレッドを1度実行した後、処理を呼び出し元に返す。

協調型スレッドを含むコルーチンライブラリの全ソースコードはこちら。
http://xfind.hp.infoseek.co.jp/electric/coroutine/coroutine_20080410.zip

Ads by Google

Leave a reply






管理者にだけ表示を許可する

該当の記事は見つかりませんでした。