LPVOID CreateFiber( DWORD StackSize, LPFIBER_START_ROUTINE FiberFunc, LPVOID Param);
この関数は、NT3.51 SP3以降で使用可能である。
CreateFiberによって作成されたファイバは、未実行の状態である。ファイバを実行するには、SwitchToFiber関数を使用する。
引数の意味は、以下の通り。
| StackSize | ファイバの初期スタックサイズ。0が指定された場合、デフォルトのスタックサイズが用いられる。ただし、スタックサイズはシステムによって動的に拡大される |
| FiberFunc | ファイバが実行するアプリケーション定義の関数へのポインタ。 |
| Param | FiberFuncに渡す引数。 |
関数の実行に成功した場合、作成されたファイバへのポインタが返される。失敗した場合、NULLが返される。
LPVOID pFiber[3];
LPVOID pMainFiber;
/* サブのファイバ用関数 */
VOID WINAPI DoFiber(DWORD FiberCount)
{
/* 処理 */
printf("スレッド%d: 処理開始\n", FiberCount);
Sleep(1000);
printf("スレッド%d: 処理終了\n", FiberCount);
/* 次のサブファイバに処理を渡す。現在のファイバが最終のファイバならば、メインファイバに処理を渡す */
if(FiberCount<2) SwitchToFiber(pFiber[FiberCount+1]);
else SwitchToFiber(pMainFiber);
}
/* メインのファイバ用関数 */
DWORD WINAPI DoMainFiber(void *p)
{
/* このスレッドをファイバに変換 */
pMainFiber = ConvertThreadToFiber(NULL);
printf("メイン開始\n");
/* 最初のサブファイバに処理を渡す */
SwitchToFiber(pFiber[0]);
printf("メイン終了\n");
return(0);
}
/* メイン関数 */
int main(int argc, char **argv)
{
HANDLE hThread;
int i;
/* サブのファイバ作成 */
for(i=0; i<3; i++) {
pFiber[i] = CreateFiber(0, (LPFIBER_START_ROUTINE)DoFiber, (LPVOID)i);
}
/* メインのファイバ用スレッド作成 */
hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)DoMainFiber, NULL, 0, NULL);
/* スレッドの終了まで待機 */
WaitForSingleObject(hThread, INFINITE);
/* 後処理 */
CloseHandle(hThread);
return(0);
}