Fiberでコルーチン

RubyじゃなくてWindows APIのほう。
Unixだとノンプリエンティブなスレッドってどうやって使うんだろう?

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

#define die(fmt, ...) \
  do { \
    fprintf(stderr, fmt, __VA_ARGS__); \
    exit(1); \
  } while(0)

void _stdcall fiber(LPVOID mf) {
  while(1) {
    puts("春");
    SwitchToFiber(mf);
    puts("夏");
    SwitchToFiber(mf);
    puts("秋");
    SwitchToFiber(mf);
    puts("冬");
    SwitchToFiber(mf);
  }
}

int main() {
  LPVOID mf, f;

  mf = ConvertThreadToFiber(NULL);

  if (mf == NULL) {
    die("ConvertThreadToFiber failed: %d", GetLastError());
  }

  f = CreateFiber(0, fiber, mf);

  if (f == NULL) {
    die("CreateFiber failed: %d", GetLastError());
  }

  while(1) {
    printf("Hit Any Key!");
    fgetc(stdin);
    SwitchToFiber(f);
  }

  return 0;
}


Hit Any Key!

Hit Any Key!

Hit Any Key!

Hit Any Key!

Hit Any Key!

Hit Any Key!

Hit Any Key!