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%를 차지하는 것을 보게 됩니다. 이는 제가 원하는 경우가 아니였습니다. 이를 해결하기 위해 저는 한 가지 방법을 알게 되었는데 위의 코드에서 주석부분을 제거 하게 되면 해당 코어 하나에 쓰레드 하나씩을 처리 시킬 수 있다는 것을 알게 되었습니다. 해당 코어를 효율 적으로 관리하면 멀티 쓰레드를 사용하더라도 좀 더 효율적으로 사용할 수 있겠지요?
[출처] 멀티 쓰레드 프로그래밍 기초 (데브라이언 스튜디오) |작성자 알자드 |
'MS > C++' 카테고리의 다른 글
멀티바이트 --> 유니코드 (매크로) (0) | 2012.11.20 |
---|---|
boost library 설치 방법 (0) | 2012.08.10 |
특정 Thread가 종료 되었는지 대기중인지 알수 있는 코드 (0) | 2012.08.10 |
OpenMP (0) | 2012.07.23 |
ms에서 dirent.h파일 사용 하기 (0) | 2012.06.08 |
ActiveX 제작시 Visat/Win7에서 주의해야 할 사항 (0) | 2011.11.18 |
gsoap (0) | 2011.11.08 |
IE8에서 ActiveX 디버깅이 되지 않을 때 (0) | 2011.10.05 |
파일 시스템 정보 얻기 (WM_DEVICECHANGE) (1) | 2010.11.05 |
CppUnit 다운로드 및 설치하기 (0) | 2010.07.07 |