週三的 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
非常有趣 ;-)

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw