SwitchToThread 実行時間割り当ての譲渡

Cの宣言:

BOOL SwitchToThread();

説明:

呼び出し元スレッドが実行されているCPUの実行時間の割り当てを一時的に他のスレッドに譲渡する。他のCPUで実行されているスレッドには譲渡されない。また、この関数が効果を持つのは1タイムスライスの間のみである。

この関数はNT4.0以降で使用可能である。

他のスレッドにCPU時間の割り当てが行われた場合、TRUEが返される。実行可能なスレッドが他に存在しないならば、FALSEが返される。

Cのサンプル:

メインの処理とサブの処理を2つのスレッドで行う。サブの処理用スレッドは優先順位が低いが、メインの処理でくり返し回数が10000回を超えたら以後1000回ごとに、CPU時間の割り当てをサブの処理用スレッドに譲渡する。
/* スレッド用関数 */
DWORD WINAPI DoThread(void *p)
{
	int i;
	HANDLE hCon;
	COORD c;

	hCon = GetStdHandle(STD_OUTPUT_HANDLE);

	c.X = 0;
	c.Y = 1;

	for(i=1; i<=10000; i++) {
		/* 排他的処理開始 */
		EnterCriticalSection(&g_section);

		SetConsoleCursorPosition(hCon, c);
		printf("サブの処理: count = %d", i);

		/* 排他的処理終了 */
		LeaveCriticalSection(&g_section);
			
	}
	
	return(0);
}

/* メイン関数 */
int main(int argc, char **argv)
{
	HANDLE hThread;
	int i;
	HANDLE hCon;
	COORD c;

	hCon = GetStdHandle(STD_OUTPUT_HANDLE);

	c.X = 0;
	c.Y = 0;

	/* クリティカルセクションオブジェクトの初期化 */
	InitializeCriticalSection(&g_section);

	/* スレッドを作成 */
	hThread = CreateThread(
		NULL, 0, (LPTHREAD_START_ROUTINE)DoThread,
		NULL, 0, NULL);

	SetThreadPriority(hThread, THREAD_PRIORITY_LOWEST);

	for(i=1; i<=50000; i++) {
		/* 排他的処理開始 */
		EnterCriticalSection(&g_section);

		/* 処理 */
		SetConsoleCursorPosition(hCon, c);
		printf("メインの処理: count = %d", i);
		
		/* 排他的処理終了 */
		LeaveCriticalSection(&g_section);

		/* 処理の譲渡 */
		if(i>10000 && i%1000 == 0) SwitchToThread();
	}

	/* スレッドの終了まで待機 */
	WaitForSingleObject(hThread, INFINITE);

	/* 後処理 */
	DeleteCriticalSection(&g_section);
	CloseHandle(hThread);

	return(0);
}

(original text:1998/12/25 更新)

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