본문 바로가기

MS/C++

SetThreadAffinityMask : 멀티 쓰레드 프로그래밍 기본

1 #include <iostream>

2 #include <conio.h>

3 #include <windows.h>

4

5 using namespace std;

6

7 DWORD WINAPI ThreadProc(LPVOID arg)

8 {

9 while( *((bool *)arg) ) Sleep(0);

10

11 return 0;

12 }

13

14 int main()

15 {

16 SYSTEM_INFO info;

17 GetSystemInfo( &info );

18

19 cout << "Process : " << info.dwNumberOfProcessors << endl;

20

21 bool *flag = new bool[ info.dwNumberOfProcessors ];

22

23 HANDLE *hThread = new HANDLE[ info.dwNumberOfProcessors ];

24

25 for( int i = 0; i < info.dwNumberOfProcessors; i++ )

26 {

27 flag[i] = true;

28 hThread[i] = CreateThread( 0, 0 , ThreadProc, &flag[i], 0, 0 );

29 // SetThreadAffinityMask( hThread[i], 1 << i );

30 }

31

32 char c;

33

34 while(1)

35 {

36 c = getch();

37

38 if( c >= '1' && c <= '9' )

39 flag[c - '1'] = false;

40

41 if( c == 13 )

42 break;

43 }

44 }

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

위 코드를 그대로 실행하게 되면 CPU점유율이 100%로 사용되게 됩니다.

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

이는 제가 원하는 경우가 아니였습니다.

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

해당 코어를 효율 적으로 관리하면 멀티 쓰레드를 사용하더라도 좀 더 효율적으로 사용할 수 있겠지요?