ファイバ考察 - その1 のコメントで稍丼さんが教えてくれたのだが、SQL Server 2005 は今のところ「lightweight pooling」と「clr enabled」は排他的にしか使用できない。http://msdn2.microsoft.com/ja-jp/library/ms175193.aspx
じゃあこれは何だったんだ。できもしないなら CLR はファイバで動くからどうとか書かないでほしい(MSDN)。少なくとも SQL Server を絡めないでほしい。いや待て。もしかしたら、lightweight pooling が無効でも、clr enabled が有効ならファイバモードになるのだろうか?一応考察する価値はあるだろう。
まずは、どうってことない簡単な事だが普通にファイバを使う方法を紹介する。尚、ファイバ関連の API は Windows XP、2003、Vista と追加され続けているので、何も考えないでいると動作する OS を選んでしまうので注意。以下は殆ど全ての OS で動作するだろう。
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
void CALLBACK Fiber2(void* lpParameter);
void CALLBACK Fiber3(void* lpParameter);
void* g_pFiber2;
void* g_pFiber3;
int _tmain(){
// 現在のスレッドをファイバに変換
ConvertThreadToFiber(NULL);
// 新しいファイバを 2 つ作成
g_pFiber2 = CreateFiber(0, Fiber2, NULL);
if(!g_pFiber2){
printf("ファイバ 2 の作成に失敗");
return -1;
}
g_pFiber3 = CreateFiber(0, Fiber3, NULL);
if(!g_pFiber3){
printf("ファイバ 3 の作成に失敗");
return -1;
}
// ファイバ 2 にスイッチ
SwitchToFiber(g_pFiber2);
printf("ここには処理が来ない");
return 0;
}
void CALLBACK Fiber2(void* lpParameter){
printf("第 2 ファイバ開始\n");
while(1){
Sleep(1000);
printf("第 2 ファイバの仕事\n");
SwitchToFiber(g_pFiber3);
}
}
void CALLBACK Fiber3(void* lpParameter){
printf("第 3 ファイバ開始\n");
while(1){
Sleep(1000);
printf("第 3 ファイバの仕事\n");
SwitchToFiber(g_pFiber2);
}
}
実行結果
第 2 ファイバ開始
第 2 ファイバの仕事
第 3 ファイバ開始
第 3 ファイバの仕事
第 2 ファイバの仕事
第 3 ファイバの仕事
第 2 ファイバの仕事
…(以下延々続く)
見て分かるように、ファイバを扱うには、まずスレッドをファイバに切り替える必要がある。ファイバの切り替えは SwitchToFiber で行う。それ以外は普通のスレッドと変わりなく扱う事が可能だ。