from: http://1stpasa.tistory.com/8

SetThreadAffinityMask

Thread Handle을 인수로 받아 특정 코어에서 해당 Thread를 실행하도록 지정해주는 함수.

0x01 부터 순서대로 한비트씩 쉬프트 하면 원하는 코어를 결정할수 있다.

주의할점은 하나의 Thread는 여러개의 코어가 모두 실행시킬수 있는데

만약 첫번째 코어와 두번째 코어가 모두 실행 가능하도록 설정하고 싶다면

01 과 10 의 OR 연산결과값인 0x03 을 설정하면 되는것이다.

만약 코어 1,2,3 에서 실행가능하게 하고 싶다면

001 , 010  그리고 100 를 OR 연산하여 호출해주면 된다.


아래의 코드는

SetThreadAffinityMask 를 테스트해보는 예제인데

주석처리된 부분을 그대로 두고 실행하면 재미있는 결과를 얻을수 있다.

실행하면 Core의 수를 출력한뒤 코어의 갯수에 해당하는 Thread를 생성하고

무한루프를 돌려서 CPU 점유율을 100%로 만들어 버린다.

그리고 콘솔창에서 숫자키 1~9까지의 숫자를 사용해 원하는 번호의 Thread를 정상종료

시킬수 있는데. 만약 듀얼코어에서 쓰레드 하나만 죽인다면 50%의 점유율을 차지하게 될것은

당연한 이치이지만. SetThreadAffinityMask 를 사용하지 않았을 경우와 사용했을 경우의

점유율 그래프를 본다면 이마를 탁 치게 될것이다. ( 벌써 알고 계셨다면.. 굳ㅋ )

  1. #include <iostream>  
  2. #include <conio.h>  
  3. #include <windows.h>   
  4.   
  5.   
  6.   
  7. using namespace std;   
  8.   
  9.   
  10. DWORD WINAPI ThreadProc(LPVOID arg)  
  11. {  
  12.  while( *((bool*)(arg))  )Sleep(0);   
  13.   
  14.   
  15.  return 0;  
  16. }   
  17.   
  18.   
  19. int main(int argc, char argv[])  
  20. {  
  21.  SYSTEM_INFO info;  
  22.  GetSystemInfo(&info);   
  23.   
  24.   
  25.  cout << info.dwNumberOfProcessors << endl;   
  26.   
  27.   
  28.  bool *flag = new bool[ info.dwNumberOfProcessors ];   
  29.   
  30.   
  31.  HANDLE *hTrhead = new HANDLE[info.dwNumberOfProcessors];   
  32.   
  33.   
  34.  for(int i = 0 ; i < info.dwNumberOfProcessors ; i++ )  
  35.  {  
  36.   flag[i] = true;  
  37.   hTrhead[i] = CreateThread(0,0,ThreadProc,&flag[i],0,0);  
  38.   //SetThreadAffinityMask( hTrhead[i]  , 1 << i );  
  39.  }   
  40.   
  41.   
  42.   
  43.  char c;  
  44.  while(1)  
  45.  {  
  46.   c = getch();   
  47.   
  48.   
  49.   if( c >= '1' && c <= '9' )  
  50.    flag[ c-'1' ] = false;   
  51.   
  52.   
  53.   if( c == 13 )  
  54.    break;  
  55.  }   
  56.   
  57.   
  58.  return 0;  
  59. }  

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지

가운데 있는 사진이 SetThreadAffinityMask 를 사용하지 않아서

코어가 쓰레드의 삽질을 같이 보듬어주고 있는경우고

아래의 사진은 SetThreadAffinityMask를 통해 하나의 코어가 하나의 쓰레드만 담당하여

2번째 쓰레드를 죽이고나니 개미와 베짱이를 연출시킨 상황이다.


'Programming' 카테고리의 다른 글

[펌] What is a Manifest (in Windows)?  (1) 2011.04.26
Manifests (from MSDN)  (0) 2011.04.26
Side by Side Configuration Incorrect의 해결책  (0) 2011.04.26
Posted by 세모아
,