16장 다중스레드프로그래밍contents.kocw.or.kr/document/thread.pdf · 2011-01-03 · 16장...
TRANSCRIPT
16장
다중 스레드 프로그래밍
김성영교수
금오공과대학교
컴퓨터공학부
2
개요
멀티태스킹과멀티스레딩
멀티태스킹 (multi tasking)
• 운영체제가여러개의프로세스를동시에실행
멀티스레딩 (multi threading)
• 응용프로그램이여러개의스레드를동시에실행
멀티스레딩의중요성
응용프로그램이스레드생성과파괴를직접관리
스레드사용여부에따라성능차이가생김
3
프로세스와 스레드 (1)
프로세스
실행중인프로그램
프로세스구성요소
가상주소공간
• 32비트윈도우의경우 4GB(사용자영역 2GB+커널영역 2GB)
실행파일과 DLL
• 코드, 리소스, 데이터(전역변수, 정적변수)
힙 / 환경변수 / 하나이상의스레드
프로세스커널객체
운영체제가프로세스를위해할당한각종자원
• 파일, 소켓, ...
4
프로세스와 스레드 (2)
스레드
프로세스의가상주소공간에존재하는실행흐름
운영체제는각스레드에 CPU 시간을나누어할당함으로써여러개의스레드가동시에실행되는효과를냄
스레드구성요소
스택
• 함수인자전달과지역변수저장을위한공간
스레드지역저장소(TLS, Thread Local Storage)
• 스레드별고유데이터를저장하기위한공간
스레드커널객체
5
프로세스와 스레드 (3)
프로세스와스레드구성요소
사용자영역
코드, 리소스, 데이터
스택(스레드 1)
스택(스레드 2)
커널영역
프로세스커널객체
환경변수
힙
가상주소공간
파일, 소켓, ...
스레드커널객체
스레드커널객체
6
CPU 스케줄링 (1)
CPU 스케줄링 운영체제가한정된 CPU 시간을여러개의프로세스(전통적인유닉스운영체제) 혹은스레드(윈도우운영체제)에분배하는정책
윈도우의 CPU 스케줄링 우선순위(Priority)에기반한 CPU 스케줄링기법을사용
• 우선순위가높은스레드에 CPU 시간을우선할당
스레드의우선순위결정요소
우선순위클래스(Priority Class)
우선순위레벨(Priority Level)
7
CPU 스케줄링 (2)
우선순위클래스
프로세스속성
같은프로세스가생성한스레드는모두동일한우선순위클래스를가짐
우선순위클래스종류
REALTIME_PRIORITY_CLASS(실시간)HIGH_PRIORITY_CLASS(높음)ABOVE_NORMAL_PRIORITY_CLASS(보통 초과; 윈도우2000/XP 이상)NORMAL_PRIORITY_CLASS(보통)BELOW_NORMAL_PRIORITY_CLASS(보통 미만; 윈도우2000/XP 이상)IDLE_PRIORITY_CLASS(낮음)
8
CPU 스케줄링 (3)
우선순위클래스종류 (cont'd)
9
CPU 스케줄링 (4)
우선순위레벨
스레드속성
같은프로세스에속한스레드간상대적인우선순위를결정
우선순위레벨종류
THREAD_PRIORITY_TIME_CRITICALTHREAD_PRIORITY_HIGHESTTHREAD_PRIORITY_ABOVE_NORMALTHREAD_PRIORITY_NORMALTHREAD_PRIORITY_BELOW_NORMALTHREAD_PRIORITY_LOWESTTHREAD_PRIORITY_IDLE
10
CPU 스케줄링 (5)
우선순위클래스 + 우선순위레벨스레드의기본우선순위(Base Priority)
...
스케줄러
CPU
스레드
(낮음) 기본우선순위 (높음)
11
MFC 스레드
MFC 스레드종류
작업자스레드(Worker Thread)
• 메시지루프가없는일반적인스레드
화면에보이지않는백그라운드작업을수행할때적합
사용자인터페이스스레드(User Interface Thread)
• 메시지처리가가능한스레드 (메시지루프가있음) 윈도우를만들고출력을하거나사용자의입력을받는등의작업을별도의스레드로처리할때적합
12
작업자 스레드 (1)
작업자스레드생성
CWinThread 타입의스레드객체(Thread Object)를동적으로생성하고내부적으로스레드를만든후스레드객체의주소값을리턴
CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,LPVOID pParam,int nPriority = THREAD_PRIORITY_NORMAL,UINT nStackSize = 0,DWORD dwCreateFlags = 0,LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
13
작업자 스레드 (2)
작업자스레드생성 (cont'd) pfnThreadProc: 스레드실행시작점이되는함수(=제어함수)의주소
• 제어함수형태 UINT func (LPVOID pParam);
pParam: 제어함수실행시전달할인자(32비트)
nPriority: 스레드우선순위레벨
nStackSize: 스레드스택크기
dwCreateFlags: 스레드생성을제어하는옵션
• 0 또는 CREATE_SUSPENDED
lpSecurityAttrs: 보안설명자와핸들상속정보
14
작업자 스레드 (3)
CWinThread 클래스의유용한함수들
int CWinThread::GetThreadPriority();
• 스레드우선순위레벨값을얻음
BOOL CWinThread::SetThreadPriority(int nPriority);
• 스레드우선순위레벨값을변경
DWORD CWinThread::SuspendThread();
• 스레드실행을일시중지
DWORD CWinThread::ResumeThread();
• 일시중지된스레드의실행을재개
15
작업자 스레드 (4)
작업자스레드종료
방법 1: 스레드제어함수가종료코드를리턴
• 0을리턴하면일반적으로정상종료를뜻함
방법 2: 스레드제어함수내에서 AfxEndThread() 함수를호출
• void AFXAPI AfxEndThread(UINT nExitCode, BOOL bDelete=TRUE); nExitCode: 스레드종료코드
bDelete: 스레드객체를제거할것인지를나타냄 FALSE를사용하면스레드객체재사용가능
방법 1에서스레드객체가소멸되지않게하기위해서는…
CWinThread* pThread = AfxBeginThread( MyFunc, NULL, THREAD_PRIORITY_NORMAL,0, CREATE_SUSPENDED );
pThread->m_bAutoDelete = FALSE;pThread->ResumeThread( );
16
Lab. 1
클라이언트영역에서마우스왼쪽버튼을클릭하면주어진상수까지의합을계산하여출력하는프로그램을작성
스레드사용전후를확인
171717
void CWorkerThreadView::OnLButtonDown( UINT nFlags, CPoint point){
int val = 600;
// 스레드를 사용하지 않은 경우CalcIt( (LPVOID)val );
}
181818
UINT CalcIt( LPVOID arg ){
// LPVOID를 int형으로 타입 캐스팅int val = (int)arg;
// 1부터 val까지 1씩 증가하면서 더함int result = 0;for( int i=1; i<val; i++ ){
result += i;Sleep( 10 ); // 계산 속도를 느리게 함
}
// 계산 결과를 표시CString str;str.Format( "계산 결과 = %d", result );AfxMessageBox(str);
return 0;}
191919
void CWorkerThreadView::OnLButtonDown( UINT nFlags, CPoint point){
int val = 600;
// 스레드를 사용한 경우AfxBeginThread( CalcIt, (LPVOID)val );
}
20
UI 스레드 (1)
UI 스레드생성절차
1. CWinThread 클래스를상속받아새로운클래스를생성
2. 클래스선언부와구현부에각각 DECLARE_DYNCREATE, IMPLEMENT_DYNCREATE 매크로를선언
3. CWinThread 클래스가제공하는가상함수중일부를재정의
• CWinThread::InitInstance() 함수는반드시재정의
• 나머지함수는필요에따라재정의
4. AfxBeginThread() 함수로새로운 UI 스레드생성
21
UI 스레드 (2)
UI 스레드생성
CWinThread 타입의스레드객체(Thread Object)를동적으로생성하고내부적으로스레드를만든후스레드객체의주소값을리턴
CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass,int nPriority = THREAD_PRIORITY_NORMAL,UINT nStackSize = 0,DWORD dwCreateFlags = 0,LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
22
UI 스레드 (3)
UI 스레드생성 (cont'd) pThreadClass: 클래스정보를담고있는 CRuntimeClass구조체
• 인자전달형태 RUNTIME_CLASS(클래스이름)
nPriority: 스레드우선순위레벨
nStackSize: 스레드스택크기
dwCreateFlags: 스레드생성을제어하는옵션
• 0 또는 CREATE_SUSPENDED
lpSecurityAttrs: 보안설명자와핸들상속정보
23
UI 스레드 (4)
UI 스레드종료
방법 1: WM_QUIT 메시지를받아서메시지루프가종료
방법 2: 스레드제어함수내에서 AfxEndThread() 함수를호출
24
실습 16.3
UI 스레드로구현된다음과같은윈도우프로그램을작성하시오. 스레드메뉴에서생성과종료처리
메뉴실행후메뉴비활성화
메시지큐가빌때마다숫자증가후화면출력
새로생성한 UI 스레드의프레임윈도우에서마우스왼쪽버튼을클릭하면윈도우와 UI 스레드종료
25
스레드 동기화 (1)
스레드동기화가필요한상황
스레드 1
공유변수int money
...
read money
money = money + 1000
write money
...
스레드 2
...
read money
money = money + 2000
write money
...
26
스레드 동기화 (2)
MFC 클래스계층도