週三的 stack-based coroutine 範例

jollen 發表於 May 30, 2007 11:37 PM

週三至工研院進行教育訓練,其中提到了「Linux pthread」的議題,並透過作業系統的觀念(sys_fork),簡單分析了一下為何 Linux pthread 是「bad」。在講解過程中,展示了一個 video surveillance 的應用程式,說明如何改用 event-driven / event-loop / feedback scheduling 的方式來取代傳統的 multi-threaded 架構。

此外,也提到 co-routine(協同式多工)的概念,建議可先行閱讀 [jserv] 兄的「使用 coroutine 實做 user-level thread」。

只以程式語言的技巧,來實作「多工」是一種很有用的做法,課程中,撰寫了一個「stack-based coroutine」的簡單實例,程式碼如下:

#include <stdio.h>
#include <pthread.h>

int count = 0;
int state = 0;

#define CHECK_POINT      \
if (count > 3) { \
   count = 0; \
   state = 1; \
   return; \
}

int foo(void)
{
   static unsigned int i;

   switch (state) {
        case 0: goto L0;
        case 1: goto L1;
   }
L0: /* start of function */
   i = 0;

   while (1) {
      i++;
      CHECK_POINT;
L1:
      printf("i = %d\n", i);
      if (i == 30) break;
      sleep(1);
   }

   printf("---------- foo exits ------------\n");
   state = 0;
   return 0;
}

void *counter(void *p)
{
   while (1) {
      count++;
      sleep(1);
   }
}

int main(void)
{
   pthread_t tid;
   pthread_create(&tid, NULL, &counter, NULL);

   count = 0;
   state = 0;

   while (1) {
      foo();
      printf("Enter event looping ...\n");
   };
}

Stack-based coroutine 是一種基於「function call」的「交錯執行」做法,最大的用途是,我們可以在「event handler」裡埋入「check point」,以達到「協同式」多工的效果。

以下是執行結果:
$ ./co
i = 1
i = 2
i = 3
i = 4
Enter event looping ...
i = 5
i = 6
i = 7
i = 8
Enter event looping ...
i = 9
i = 10
...
Enter event looping ...
i = 29
i = 30
---------- foo exits ------------
Enter event looping ...
i = 1
i = 2
i = 3
Enter event looping ...
i = 4
非常有趣 ;-)

讀者留言 (1)

  • Web Host 於 November 8, 2012 10:52:

    期待下文~

留言功能維護中。將於近日重新開放。

連絡作者

Jollen Chen,Moko365(仕橙3G教室)講師,熱愛研究 Linux 與 Android 技術。曾為 Motorola、HTC、Foxconn、LG、OPPO、騰迅、廣達電腦、緯創、仁寶等超過 50 家企業講授課程。目前在 MokoVersity 擔任軟體工程師,撰寫 Node.js 程式,也在幾家科技廠兼任 Android Framework 研發顧問。您可透過電子郵件 <jollen (at) jollen (dot) org> 或這裡與我連絡。