본문 바로가기
Visual C++/General

SetThreadAffinityMask

by hyperhand 2009. 2. 26.
  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. }  

 

 

 

 


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

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

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

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

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

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

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

쓰레드를 사용하면서 최근 보급이 되어버린 듀얼코어나 쿼드코어에서 해당 코어를 효율적으로 활용할 수 있는 방법이 있지 않을까 해서 알게 된 팁을 적어봅니다.

사용자 삽입 이미지



그리고 1~9까지 해당 쓰레드 번호를 누르게 되면 CPU 점유율이 50%가 됩니다. 해당 쓰레드를 종료하기 때문이죠. 하지만 여기서 해당 코어 하나만 쓰는게 아니라 두개의 코어에서 불규칙적으로 서로 상호하며 점유율을 50%를 차지하는 것을 보게 됩니다.

 

사용자 삽입 이미지


이를 해결하기 위해 저는 한가지 방법을 알게 되었는데 위의 코드에서 주석부분을 제거하게 되면 해당 코어 하나에 쓰레드 하나씩을 처리시킬 수 있다는 것을 알게 되었습니다.

사용자 삽입 이미지
반응형