SetThreadAffinityMaskは、マルチコアCPUのどのコアを使用するかを設定します



Setthreadaffinitymask Sets Which Core Multi Core Cpu Is Used



MSDNでの説明:
SetThreadAffinityMask
The SetThreadAffinityMask function sets a processor affinity mask for the specified thread.

DWORD_PTR SetThreadAffinityMask(
HANDLE hThread,
DWORD_PTR dwThreadAffinityMask
)

パラメーター
hThread
[in]アフィニティマスクを設定するスレッドへのハンドル。
このハンドルには、THREAD_SET_INFORMATIONおよびTHREAD_QUERY_INFORMATIONアクセス権が必要です。詳細については、「スレッドのセキュリティとアクセス権」を参照してください。

dwThreadAffinityMask
[in]スレッドのアフィニティマスク。
Windows Me / 98/95:この値は1でなければなりません。

戻り値
関数が成功した場合、戻り値はスレッドの以前のアフィニティマスクです。

Windows Me / 98/95:戻り値は1です。成功するには、hThreadが有効で、dwThreadAffinityMaskが1である必要があります。

関数が失敗した場合、戻り値はゼロです。拡張エラー情報を取得するには、GetLastErrorを呼び出します。

備考
スレッドアフィニティマスクは、各ビットがスレッドの実行を許可されているプロセッサを表すビットベクトルです。

スレッドアフィニティマスクは、スレッドを含むプロセスのプロセスアフィニティマスクの適切なサブセットである必要があります。スレッドは、そのプロセスの実行が許可されているプロセッサでのみ実行できます。



SetThreadAffinityMaskを呼び出すことにより、各スレッドにアフィニティマスキングを設定できます。

DWORD_PTR SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask)

関数のhT h r e a dパラメーターは、制限するスレッドを示すために使用され、dwThreadAffinityMaskは、スレッドを実行できるCPUを示すために使用されます。 dwThreadAffinityMaskは、プロセスのアフィニティマスクの対応するサブセットである必要があります。戻り値は、スレッドの以前のアフィニティマスクです。

したがって、実行するCPU 1、2、および3に3つのスレッドを制限するには、次のようにします。

//Thread 0 can only run on CPU 0.

SetThreadAffinityMask(hThread0, 0x00000001) //The 0th bit is 1

//Threads 1, 2, 3 run on CPUs 1, 2, 3.//The 1 2 3 bit is 1

SetThreadAffinityMask(hThread1, 0x0000000E)

SetThreadAffinityMask(hThread2, 0x0000000E)

SetThreadAffinityMask(hThread3, 0x0000000E)




この記事はCSDNブログからのものです。ソースを示してください:http://blog.csdn.net/W511522329/archive/2010/03/06/5352597.aspx

#include 'stdafx.h'
#include
#include
#include
void running(int seconds) {
Sleep(seconds*1000)
std::cout<<'sleep for '<}

int _tmain(int argc, _TCHAR* argv[])
{
SetThreadAffinityMask(GetCurrentThread(), 1)
LARGE_INTEGER start, end
LARGE_INTEGER freq
//timeConsuming()
QueryPerformanceFrequency(&freq)
QueryPerformanceCounter(&start)//start


std::cout<<'start.QuadPart = '< running(10) //running 10 seconds
QueryPerformanceCounter(&end) //end
std::cout<<'end.QuadPart = '<
std::cout<<'consume value = end.QuadPart - start.QuadPart = '<<(end.QuadPart - start.QuadPart)< std::cout<<'(consume value/(double)freq.QuadPart) Time consumed = '<<(end.QuadPart - start.QuadPart)/(double)freq.QuadPart<<'(s)'< return 0
}



[color = red] start.QuadPart = 49102789906513
10分間眠る
end.QuadPart = 49127801303663
消費値= end.QuadPart-start.QuadPart = 25011397150
(消費値/(double)freq.QuadPart)消費時間= 10.0046(s)[/ color]