SwitchToFiber ファイバの処理引き渡し

Cの宣言:

VOID SwitchToFiber(LPVOID Fiber);

説明:

他のファイバへ処理を渡す。呼び出し元はファイバでなければならない。

この関数は、NT3.51 SP3以降で使用可能である。

SwitchToFiber関数を実行すると、呼び出し元ファイバの処理が中断され、Fiberで指定したファイバの処理が実行される。中断中のファイバへ処理を渡した場合、中断した時点から再び処理が再開される。

SDKのドキュメントには、“SwitchToFiber(GetCurrentFiber())”を行うと予期せぬ動作が発生する、と述べられている。

引数の意味は、以下の通り。
Fiber 処理の引き渡し先のファイバを指すポインタ。

Cのサンプル:

メインのファイバと、3つのサブのファイバによって処理を行う。メインのファイバは、最初のサブのファイバに処理を渡す。サブのファイバは、処理を行った後に、次のサブのファイバに処理を渡す。最後のサブのファイバは、処理が終了したら、再びメインのファイバに処理を渡す。
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);
}
(original text:1998/12/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。