در این پست توضیحات مختصری درمورد سه API ویندوز میدهیم و برای هر یک مثالی میزنیم .

BOOL WINAPI SetProcessAffinityMask(
  HANDLE    hProcess,
  DWORD_PTR dwProcessAffinityMask
);
DWORD_PTR WINAPI SetThreadAffinityMask(
  HANDLE    hThread,
  DWORD_PTR dwThreadAffinityMask
);
void WINAPI GetSystemInfo(
  LPSYSTEM_INFO lpSystemInfo
);

SetProcessAffinityMask :
این تابع ترد پراسس را بر روی یک هسته (CPU) قرار میدهد . در صورت موفقیت تابع مقداری غیر صفر را باز میگرداند و در غیر این صورت تابع مقدار صفر را برمیگرداند .

پارامتر اول یک هندل را دریافت میکند که هندل پراسس ما میباشد ( نحوه بدست آوردن هندل برنامه در سورس قابل مشاهده میباشد ) .

مثال : در این مسال تسک منیجر را باز کنید تا نتیجه قابل مشاهده باشد .

#include <iostream>
#include <conio.h>
#include <Windows.h>
using namespace std;
int main()
{
HANDLE process = GetCurrentProcess();

DWORD_PTR processAffinityMask;
DWORD_PTR systemAffinityMask;

if (!GetProcessAffinityMask
(process, &processAffinityMask, &systemAffinityMask))
{
return -1;
}

/* set this to the core you want your process to run on */
 int core = 2;
DWORD_PTR mask = 0x1;
for (int bit = 0, currentCore = 1; bit < 64; bit++)
{
if (mask & processAffinityMask)
{
if (currentCore != core)
{
processAffinityMask &= ~mask;
}
currentCore++;
}
mask = mask << 1;
}
BOOL success = SetProcessAffinityMask
(process, processAffinityMask);
cout << success << endl;

int a1 = 0;
for (int i1 = 0; i1 < 100; i1)
{
for (int j1 = 0; j1 < 10; j1)
{
for (int k1 = 0; k1 < 10; k1)
{
a1++;
}
}
}
_getch();
return 0;
}


SetThreadAffinityMask , GetSystemInfo :

این تابع ترد مورد نظر را بر رو هسته (CPU) مورد نظر اجرا میکند . این تابع در صورت شکست مقدار صفر را برمیگرداند .تابع دیگر برای گرفتن اطلاعات و تعداد هسته (CPU) های کامپیوتر به کار میرود . در این برنامه ما تعداد هسته ها را خوانده و سپس آن را نمایش داده تا کاربر بداند چه تعداد هسته بر روی کامپیوتر دارد تا بتواند یکی از آن ها را برای اجرا شدن ترد بر روی آن انتخاب کند  .

#include <iostream>
#include <conio.h>
#include <Windows.h>
using namespace std;
void threadMain()
{
int a = 0;
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 10000; j++)
{
for (int k = 0; k < 10000; k++)
{
a++;
}
}
}
}
int main(int argc, wchar_t **args)
{
HANDLE *m_threads = NULL;
DWORD_PTR coreNumber = 0;
SYSTEM_INFO m_si = { 0, };

GetSystemInfo(&m_si);//get information system
cout << "Number of processors : "
<< m_si.dwNumberOfProcessors << endl;

m_threads = new HANDLE[m_si.dwNumberOfProcessors];

cout << "Enter core number (0 1 2 3 4 5 6 ...) : ";
cin >> coreNumber;

for (DWORD_PTR i = 0;i < m_si.dwNumberOfProcessors;i++)
{
DWORD_PTR m_id = 0;
DWORD_PTR m_mask = 1 << i;
if (i == coreNumber)
{
m_threads[i] = CreateThread
(NULL, 0, (LPTHREAD_START_ROUTINE)threadMain,
 (LPVOID)i, NULL, &m_id);
SetThreadAffinityMask(m_threads[i], m_mask);
wprintf(
L"Creating Thread %d (0x%08x) Assigning to CPU 0x%08x\r\n"
,i, (LONG_PTR)m_threads[i], m_mask);
}
}

_getch();
return 0;
}