Visual C++ Programming Tree Control/MultiThread

Slides:



Advertisements
Similar presentations
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
Advertisements

Lab 10 Guide: 프린터 출력 예제. 한 페이지의 그림 인쇄 (교재 24장, 쪽)
Image & Video processing
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
최윤정 Java 프로그래밍 클래스 상속 최윤정
Java로 배우는 디자인패턴 입문 Chapter 5. Singleton 단 하나의 인스턴스
윤 홍 란 다이알로그(대화상자) 윤 홍 란
제 9 장 구조체와 공용체.
Chapter 4 Multi-Threaded Socket
컴퓨터 프로그래밍 기초 [Final] 기말고사
Visual C++ Programming Tree Control/MultiThread
공통 컨트롤의 종류와 특징을 개관한다. 각종 공통 컨트롤의 사용 방법을 익힌다..
스레드의 개념과 동작 원리를 이해한다. MFC 스레드의 두 종류인 작업자 스레드와 UI 스레드 사용법을 익힌다.
MultiThread.
5장. 참조 타입.
07. 디바이스 드라이버의 초기화와 종료 김진홍
CHAPTER 02 OpenCV 개요 PART 01 영상 처리 개요 및 OpenCV 소개.
Visual C++ Programming MultiThread
Visual C++ Programming Common Controls
Visual C++ Programming Common Controls
Chap08 다중 스레드 8.1 스레드 개요 8.2 Thread 클래스와 스레드 생명주기 8.3 스레드 생성과 사용
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.
DK-128 ADC 실습 아이티즌 기술연구소
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
WinCE Device Driver 실습 #3
WinCE Device Driver 실습 #2
Sungkyunkwan University OS Project Dongkun Shin
DK-128 FND 실습 아이티즌 기술연구소 김태성 연구원
MicroC/OS-II 3. Memory Management ITISN Technical Lab.
분할 윈도, 다중 뷰… 영상 통신 연구실 권 동 진 발표 일 : 04월 27일.
10장. 예외처리.
13. 연산자 오버로딩.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
멀티스레드 Chapter 05. * 학습목표 멀티스레드의 필요성을 이해하고 기본 개념을 익힘.
인터넷응용프로그래밍 JavaScript(Intro).
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
메모리 관리 & 동적 할당.
DK-128 FND 실습 아이티즌 기술연구소
Lesson 2. 기본 데이터형.
Lab 1 Guide: 교재 2장 DrawX ( 쪽)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
자바 5.0 프로그래밍.
윈도우 컨트롤.
데이터베이스실험실 석사 2학기 조정희 TCP/IP Socket Programming… 제 18장 윈도우 기반 쓰레드 사용하기 데이터베이스실험실 석사 2학기 조정희
Part 4 클래스 라이브러리 Chapter 10 : 다중 스레드 Chapter 11 : 패키지와 주요 클래스
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
컴퓨터 계측 및 실습 디지털 출력 영남대학교 기계공학부.
객체기반 SW설계 팀활동지 4.
데이터 동적 할당 Collection class.
12강. 컨트롤러 컨트롤러 클래스 제작 요청 처리 메소드 제작 뷰에 데이터 전달
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
.Net Web Application 2007 컴퓨터공학실험(Ⅰ)
가장 많이 사용 Accelerator 최상위 WM_COMMAND, OLE 메시지 관련 이벤트 처리만 가능 이 클래스를 상속받아서 다른 이벤트 처리 이벤트 처리 관련 윈도우(창) 최상위 클래스 멀티 테스킹(모듈) CFrameWnd, Cview,
3. 모듈 (5장. 모듈).
01. 분산 파일 시스템의 개요 네트워크에 분산된 파일을 사용자가 쉽게 접근하고 관리할 수 있게 해준다.
발표자 : 이지연 Programming Systems Lab.
9 브라우저 객체 모델.
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
제 4 장 Record.
엔코더 프로그램 설명 // 쓰레드를 사용하기 때문에 변수와 핸들을 전역변수로 지정 HANDLE hDevice;
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
CODE INJECTION 시스템B 김한슬.
7 생성자 함수.
6 객체.
MFC 기초 윈도우 응용프로그램 개발 간략한 역사 Microsoft Foundation Classes
Presentation transcript:

Visual C++ Programming Tree Control/MultiThread Department of Digital Contents Sang Il Park

CImageList

이미지 리스트 (1/9) 이미지 리스트 사용 예 동일한 크기의 이미지 집합 각각의 이미지를 배열 항목처럼 취급하여 0부터 시작하는 인덱스로 참조 사용 예 트리 컨트롤과 리스트 컨트롤에 사용되는 비트맵

이미지 리스트 (2/9) 이미지 리스트 생성 방법 이미지 리스트 생성 함수 cx, cy: 이미지의 폭과 높이(픽셀 단위) nFlags: 이미지 리스트의 타입 지정 CImageList m_il; m_il.Create(...); BOOL CImageList::Create (int cx, int cy, UINT nFlags, int nInitial, int nGrow); BOOL CImageList::Create (UINT nBitmapID, int cx, int nGrow, COLORREF crMask);

이미지 리스트 (4/9) 이미지 리스트 생성 예 IDB_BITMAP1 CImageList m_il1, m_il2; m_il1.Create(32, 32, ILC_COLOR4, 2, 1); m_il2.Create(IDB_BITMAP1, 48, 1, RGB(255, 255, 255));

이미지 리스트 (6/9) 이미지 추가: // 두 개의 아이콘을 이미지 리스트에 추가한다. m_il1.Add(AfxGetApp()->LoadIcon(IDI_ICON1)); m_il1.Add(AfxGetApp()->LoadIcon(IDI_ICON2)); // 비트맵을 이미지 리스트에 추가한다. CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); m_il2.Add(&bitmap, RGB(255, 255, 255));

이미지 리스트 (7/9) 화면 출력 함수 pDC: 출력할 대상을 나타내는 디바이스 컨텍스트 nImage: 출력할 이미지의 인덱스 pt: 출력 좌표 nStyle: 그리기 스타일(다음 페이지 표 참조) BOOL CImageList::Draw (CDC* pDC, int nImage, POINT pt, UINT nStyle);

이미지 리스트 (8/9) 그리기 스타일

이미지 리스트 (9/9) 화면 출력 예 void CExImageListView::OnDraw(CDC* pDC) { // 배경색을 CLR_NONE으로 설정한다. m_il.SetBkColor(CLR_NONE); m_il.Draw(pDC, 0, CPoint(100, 200), ILD_NORMAL); m_il.Draw(pDC, 0, CPoint(150, 200), ILD_BLEND25); m_il.Draw(pDC, 0, CPoint(200, 200), ILD_BLEND50); m_il.Draw(pDC, 0, CPoint(250, 200), ILD_MASK); }

Tree Control

트리 컨트롤 (1/2) 트리 컨트롤 = 트리 뷰 컨트롤 이미지와 텍스트를 이용하여 계층적인 형태로 정보를 표시하는 용도로 사용

트리 컨트롤 (2/2) 용어 항목 부모 항목 자식 항목 루트 항목 트리 컨트롤에 표시되는 하나의 정보 하나 이상의 하위 항목을 가진 항목 자식 항목 부모 항목에 딸린 하위 항목 루트 항목 계층 구조에서 최상위 항목 루트 항목은 부모 항목을 가지지 않음

트리 컨트롤 클래스 (1/11) 트리 컨트롤 생성과 초기화 CTreeCtrl 객체 선언 후 CTreeCtrl::Create()로 트리 컨트롤 생성 CImageList 객체 선언 후 CImageList::Create(), CImageList::Add() 등을 이용하여 생성과 초기화 CTreeCtrl::SetImageList()로 트리 컨트롤에서 사용할 이미지 리스트 설정 CTreeCtrl::InsertItem()으로 항목 추가

트리 컨트롤 클래스 (2/11) 예제 코드 // ① CTreeCtrl 객체 선언과 트리 컨트롤 생성 m_tree.Create(WS_CHILD|WS_VISIBLE|WS_BORDER| TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT, CRect(10, 10, 150, 150), this, 101); // ② CImageList 객체 선언과 이미지 리스트 생성, 초기화 CImageList il; il.Create(IDB_BITMAP1, 16, 1, RGB(255, 255, 255));

트리 컨트롤 클래스 (3/11) 예제 코드 (cont'd) // ③ 이미지 리스트 설정 m_tree.SetImageList(&il, TVSIL_NORMAL); il.Detach(); // ④ 항목 추가 // 1레벨 초기화 HTREEITEM hSun = m_tree.InsertItem("태양", 0, 0, TVI_ROOT, TVI_LAST);

트리 컨트롤 클래스 (4/11) 예제 코드 (cont'd) // 2레벨 초기화 m_tree.InsertItem("수성", 1, 1, hSun, TVI_LAST); m_tree.InsertItem("금성", 1, 1, hSun, TVI_LAST); HTREEITEM hEarth = m_tree.InsertItem("지구", 1, 1, hSun, TVI_LAST); HTREEITEM hMars = m_tree.InsertItem("화성", 1, 1, hSun, TVI_LAST); // 3레벨 초기화 m_tree.InsertItem("달", 2, 2, hEarth, TVI_LAST); m_tree.InsertItem("포보스", 2, 2, hMars, TVI_LAST); m_tree.InsertItem("데이모스", 2, 2, hMars, TVI_LAST);

트리 컨트롤 클래스 (5/11) 주요 함수 dwStyle: 컨트롤 스타일을 지정. 일반 윈도우 스타일(WS_*)과 트리 컨트롤 스타일(TVS_*)의 조합을 사용 rect: 컨트롤의 크기와 위치 pParentWnd: 부모 윈도우 nID: 컨트롤 ID BOOL CTreeCtrl::Create (DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

트리 컨트롤 클래스 (6/11) 주요 함수 (cont'd) pImageList: 트리 컨트롤에서 사용할 이미지 리스트 nImageListType: 이미지 리스트에 포함된 이미지의 용도. 항목을 나타내는 일반 이미지일 경우에는 TVSIL_NORMAL, 사용자 정의 상태 이미지일 경우에는 TVSIL_STATE를 사용 CImageList* CTreeCtrl::SetImageList (CImageList * pImageList, int nImageListType);

트리 컨트롤 클래스 (7/11) 주요 함수 (cont'd) lpszItem: 항목에 표시할 텍스트 nImage: 항목에 표시할 이미지를 나타내며 이미지 리스트에서의 인덱스 값을 사용 nSelectedImage: 항목이 선택되면 표시할 이미지를 나타내며 이미지 리스트에서의 인덱스 값을 사용 HTREEITEM CTreeCtrl::InsertItem (LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);

트리 컨트롤 클래스 (8/11) 주요 함수 (cont'd) hParent: 부모 항목을 나타내는 HTREEITEM 값이다. 루트 항목을 추가할 경우에는 TVI_ROOT를 사용 hInsertAfter: 항목을 추가할 위치를 나타내며 보통 다음 표의 값 중 하나를 사용. 항목 다음 위치에 추가하고 싶을 경우 그 항목을 나타내는 HTREEITEM 값을 사용 값 의미 TVI_FIRST 제일 앞쪽에 추가한다. TVI_LAST 제일 뒤쪽에 추가한다. TVI_ROOT 루트 항목으로 추가한다. TVI_SORT 철자순으로 정렬이 되도록 추가한다.

트리 컨트롤 클래스 (9/11) 스타일 변경하기 dwRemove: 제거할 스타일 dwAdd: 추가할 스타일 nFlags: 기본값 사용 BOOL CWnd::ModifyStyle (DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0);

트리 컨트롤 클래스 (10/11) 선택 항목 알아내기 HTREEITEM hItem = m_tree.GetSelectedItem(); if(hItem != NULL) { CString str = m_tree.GetItemText(hItem); MessageBox(str); }

트리 컨트롤 클래스 (11/11) 항목 추가와 삭제 항목 추가 항목 삭제 CTreeCtrl::InsertItem() CTreeCtrl::DeleteItem() HTREEITEM hItem = m_tree.GetSelectedItem(); if(hItem != NULL) { m_tree.DeleteItem(hItem); }

기타 공통 콘트롤 탭 컨트롤 프로그레스 컨트롤 동일한 화면 영역에 서로 다른 내용을 표시 오랜 시간이 걸리는 작업의 진행 상황을 시각적으로 표시하는 용도로 사용

Announcement Programming Assignment #5 제출일 연기 기말 고사 공고 6월 21일 토요일 6월 19일 목요일 수업시간/수업장소 문제유형: 중간고사와 동일 숙제/교재 예제에서도 출제 Open Book/No Network

Multi-Threading

개요 멀티태스킹과 멀티스레딩 멀티스레딩의 중요성 멀티태스킹 멀티스레딩 응용 프로그램이 직접 스레드 생성과 파괴를 관리 하나의 CPU가 여러 개의 프로세스를 교대로 수행 멀티스레딩 하나의 CPU가 여러 개의 스레드를 교대로 수행 멀티스레딩의 중요성 응용 프로그램이 직접 스레드 생성과 파괴를 관리 스레드 사용 여부에 따라 응용 프로그램의 성능 차이가 생기므로 중요한 프로그래밍 요소임

프로세스와 스레드 (1/4) 프로세스 프로세스 구성 요소 실행 중인 프로그램 가상 주소 공간 - 32비트 윈도우의 경우 4기가 바이트 가상 주소 공간에 로드된 실행 파일과 DLL(코드+리소스+데이터) 프로세스를 위해 운영체제가 할당한 각종 리소스(파일, 파이프, ...) 프로세스 커널 객체 하나 이상의 스레드

프로세스와 스레드 (2/4) 프로세스 구성 요소 (cont'd) 프로세스의 가상 주소 공간 코드, 리소스, 데이터 스레드 1 스레드 2 윈도우 운영체제 프로세스 커널 객체 파일, 파이프, ...

프로세스와 스레드 (3/4) 스레드 스레드 구성 요소 프로세스의 가상 주소 공간에 존재하는 실행 흐름 운영 체제는 각 스레드에게 일정한 CPU 시간을 교대로 할당함으로써 여러 개의 스레드가 병렬적으로 실행되는 효과를 만들어 냄 스레드 구성 요소 스택 커널 모드와 사용자 모드에서 실행하기 위한 두 개의 스택 스레드 커널 객체 CPU 레지스터 값, ...

프로세스와 스레드 (4/4) 프로세스와 스레드 구성 요소 프로세스의 가상 주소 공간 코드, 리소스, 전역 데이터 스택 (스레드 1) 힙(Heap) 환경 변수 (스레드 2) 윈도우 운영체제 프로세스 커널 객체 스레드 ...

CPU 스케줄링 (1/5) CPU 스케줄링 윈도우의 CPU 스케줄링 스레드의 우선순위 결정 요소 우선순위(Priority)에 기반한 CPU 스케줄링 기법을 사용 우선순위가 높은 스레드에게 우선적으로 CPU 시간 할당 스레드의 우선순위 결정 요소 프로세스 우선순위: 우선순위 클래스(Priority Class) 스레드 우선순위: 우선순위 레벨(Priority Level)

CPU 스케줄링 (2/5) 우선순위 클래스 우선순위 클래스 종류 프로세스 속성 하나의 프로세스가 생성한 스레드는 모두 동일한 우선순위 클래스를 가짐 우선순위 클래스 종류 REALTIME_PRIORITY_CLASS(실시간) HIGH_PRIORITY_CLASS(높음) ABOVE_NORMAL_PRIORITY_CLASS(보통 초과; 윈도우2000/XP) NORMAL_PRIORITY_CLASS(보통) BELOW_NORMAL_PRIORITY_CLASS(보통 미만; 윈도우2000/XP) IDLE_PRIORITY_CLASS(낮음)

CPU 스케줄링 (3/5) 우선순위 클래스 종류 (cont'd)

CPU 스케줄링 (4/5) 우선순위 레벨 우선순위 레벨 종류 스레드 속성 같은 프로세스에 속한 스레드 사이에서 상대적인 우선순위를 결정할 때 사용 우선순위 레벨 종류 THREAD_PRIORITY_TIME_CRITICAL THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_NORMAL THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_LOWEST THREAD_PRIORITY_IDLE

CPU 스케줄링 (5/5) 우선순위 클래스 + 우선순위 레벨  기초 우선순위(Base Priority) ... 스케줄러 CPU 스레드 (낮음) 기초 우선순위 (높음)

스레드 동기화 (1/2) 스레드 동기화가 필요한 상황 스레드 1 공유 변수 int money ... ① read money ② money = money+1000 ③ write money 스레드 2 ② money = money+2000

스레드 동기화 (2/2) 동기화 문제는 MFC 라이브러리 사이에서도 발생될 수 있다.  적절한 C/C++ 라이브러리 선택

MFC 스레드 MFC 스레드 종류 작업자 스레드 사용자 인터페이스 스레드(UI 스레드) 메시지 루프를 가지고 있지 않다. 메시지 루프를 가지고 있다.

작업자 스레드 사용하기: 1. 작업을 수행할 전역함수 선언 UINT DoIt( LPVOID value ) { … Unsigned Integer LPVOID: 32bit 크기를 가지는 임의의 변수형 (ex. 정수, pointer) 1. 작업을 수행할 전역함수 선언 2. 전역함수를 AfxBeginThread를 통해 호출 UINT DoIt( LPVOID value ) { … } AfxBeginThread(DoIt, (LPVOID) value);

작업자 스레드 (1/5) 스레드 생성  CWinThread 타입 객체를 동적으로 생성하고 (스레드 를 만든 후) 이 객체의 주소값을 리턴 CWinThread* AfxBeginThread ( AFX_THREADPROC pfnThreadProc, // 함수이름 LPVOID pParam, // 전달할 파라메터 int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );

작업자 스레드 (2/5) 스레드 생성 (cont'd) pfnThreadProc: 스레드 실행 시작점이 되는 함수(=제어 함수)의 주소 제어 함수의 형태  UINT 함수이름 (LPVOID pParam); pParam: 제어 함수에 전달할 인자(32비트) nPriority: 스레드의 우선순위 레벨 nStackSize: 스레드 스택의 크기 dwCreateFlags: 0 또는 CREATE_SUSPENDED lpSecurityAttrs: 보안 설명자와 핸들 상속 정보

작업자 스레드 (3/5) 스레드 제어 스레드 우선순위 레벨 값을 얻음 스레드 우선순위 레벨 값을 변경 스레드 실행을 일시 정지 스레드를 재시작 int CWinThread::GetThreadPriority (); BOOL CWinThread::SetThreadPriority (int nPriority); DWORD CWinThread::SuspendThread (); DWORD CWinThread::ResumeThread ();

작업자 스레드 (4/5) 스레드 종료 방법 1: 스레드 제어 함수가 리턴. 리턴값이 0이면 일반적으로 정상 종료를 뜻함 방법 2: 스레드 제어 함수 내에서 AfxEndThread() 호출

작업자 스레드 (5/5) 스레드 종료 (cont'd) nExitCode: 스레드 종료 코드 bDelete: 스레드 객체를 메모리에서 제거할 것인지를 나타냄. FALSE를 사용하면 스레드 객체 재사용 가능 void AFXAPI AfxEndThread( UINT nExitCode, BOOL bDelete = TRUE );

UI 스레드 (1/4) UI 스레드 생성 과정 CWinThread 클래스로부터 새로운 클래스를 파생 클래스 선언부와 구현부에 각각 DECLARE_DYNCREATE, IMPLEMENT_DYNCREATE 매크로 선언. CWinThread 클래스가 제공하는 가상 함수 중 일부를 재정의. CWinThread::InitInstance()는 반드시 재정의해야 하며, 나머지 함수는 필요에 따라 재정의함. AfxBeginThread()를 이용하여 새로운 UI 스레드 생성

UI 스레드 (2/4) 스레드 생성  CWinThread 타입 객체를 동적으로 생성하고 (스레드 를 만든 후) 이 객체의 주소값을 리턴 CWinThread* AfxBeginThread ( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );

UI 스레드 (3/4) 스레드 생성 (cont'd) pThreadClass: 객체 정보를 담고 있는 CRuntimeClass 구조체의 주소 사용 형태  RUNTIME_CLASS(클래스이름) nPriority: 스레드의 우선순위 레벨 nStackSize: 스레드 스택의 크기 dwCreateFlags: 0 또는 CREATE_SUSPENDED lpSecurityAttrs: 보안 설명자와 핸들 상속 정보

UI 스레드 (4/4) 스레드 종료 방법 1: WM_QUIT 메시지를 받아서 메시지 루프가 종료 방법 2: 스레드 제어 함수 내에서 AfxEndThread() 호출

스레드 동기화 (1/3) MFC 클래스 계층도

스레드 동기화 (2/3) 클래스 요약 CSyncObject 스레드 동기화 클래스를 위한 공통의 인터페이스 제공 CCriticalSection, CEvent, CMutex, CSemaphore 윈도우 운영체제에서 제공하는 스레드 동기화 객체(임계 영역, 이벤트, 뮤텍스, 세마포)를 편리하고 일관성 있게 사용할 수 있도록 만든 클래스 CSingleLock, CMultiLock 스레드 동기화 클래스를 편리하게 사용할 수 있도록 보조

스레드 동기화 (3/3) 스레드 동기화가 필요한 상황 스레드 동기화 원리 두 개 이상의 스레드가 공유 리소스를 사용하는 경우 하나의 스레드가 작업을 완료한 후, 기다리고 있던 다른 모든 스레드에게 알려주는 경우 스레드 동기화 원리 스레드 1 매개체 스레드 2 진행 대기

임계 영역 (1/2) 용도 장점 단점 같은 프로세스에 속한 스레드 간의 동기화 속도가 빠름 공유 리소스를 접근하는 다수의 스레드가 있을 때 오직 하나의 스레드만 접근할 수 있도록 함 장점 속도가 빠름 단점 서로 다른 프로세스에 속한 스레드 간의 동기화를 위한 목적으로는 사용할 수 없음

임계 영역 (2/2) 사용 예 // 전역 변수로 선언 CCriticalSection g_cs; ... // 스레드 1 g_cs.Lock(); // 공유 변수 접근 g_cs.Unlock(); // 스레드 2

뮤텍스 (1/3) 용도 장점 단점 공유 리소스를 접근하는 다수의 스레드가 있을 때 오직 하나의 스레드만 접근할 수 있도록 함 서로 다른 프로세스에 속한 스레드 간의 동기화를 위한 목적으로는 사용할 수 있음 단점 임계 영역보다 속도가 느림

뮤텍스 (2/3) 뮤텍스 생성 bInitiallyOwn: TRUE면 뮤텍스를 생성한 스레드가 소유자가 됨 lpszName: 뮤텍스 이름 lpsaAttribute: 보안 설명자와 핸들 상속 관련 구조체 CMutex::CMutex ( BOOL bInitiallyOwn = FALSE, LPCTSTR lpszName = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL );

뮤텍스 (3/3) 사용 예 // 전역 변수로 선언 CMutex g_mutex(FALSE, NULL); ... // 스레드 1 g_cs.Lock(); // 공유 변수 접근 g_cs.Unlock(); // 스레드 2

이벤트 (1/5) 이벤트 용도 신호(Signaled)와 비신호(Nonsignaled) 두 개의 상태를 가진 동기화 객체 두 개 이상의 스레드가 공유 리소스를 사용하는 경우  임계 영역, 뮤텍스, 이벤트(자동 리셋) 하나의 스레드가 작업을 완료한 후, 기다리고 있던 다른 모든 스레드에게 알려주는 경우  이벤트(수동 리셋)

이벤트 (2/5) 이벤트 객체를 이용한 동기화 이벤트 객체를 비신호 상태로 생성 하나의 스레드가 초기화 작업을 진행하고, 나머지 스레드는 이벤트 객체에 대해 Lock()을 호출함으로써 이벤트 객체가 신호 상태가 되기를 기다림 스레드가 초기화 작업을 완료하면 이벤트 객체를 신호 상태로 바꿈 기다리고 있던 모든 스레드가 깨어나서 작업을 진행

이벤트 (3/5) 종류 자동 리셋(Auto Reset) 수동 리셋(Manual Reset) 이벤트 객체를 신호 상태로 바꾸면, 기다리는 스레드 중 하나만 깨운 후 자동으로 비신호 상태가 됨 수동 리셋(Manual Reset) 이벤트 객체를 신호 상태로 바꾸면, 계속 신호 상태를 유지. 결과적으로 기다리는 스레드를 모두 깨우게 됨. 리셋을 하려면 명시적으로 함수를 호출해야 함

이벤트 (4/5) 이벤트 생성 bInitiallyOwn: FALSE면 비신호, TRUE면 신호 상태 bManualReset: FALSE면 자동 리셋, TRUE면 수동 리셋 lpszName: 이벤트 이름 lpsaAttribute: 보안 설명자와 핸들 상속 관련 구조체 CEvent::CEvent ( BOOL bInitiallyOwn = FALSE, BOOL bManualReset = FALSE, LPCTSTR lpszName = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL );

이벤트 (5/5) 이벤트 상태 변경 이벤트 객체를 신호 상태로 바꿈 이벤트 객체를 비신호 상태로 바꿈 이벤트 객체를 신호 상태로 바꾸고, 신호 상태를 기다리는 다른 스레드를 깨운 후, 다시 비신호 상태로 바꿈 BOOL CEvent::SetEvent(); BOOL CEvent::ResetEvent(); BOOL CEvent::PulseEvent();

세마포 (1/3) 세마포 한정된 개수의 자원을 여러 스레드가 접근하려고 할 때, 이를 제어하는 동기화 객체 사용 가능한 리소스의 개수(=리소스 카운트)를 유지하여 수행될 수 있는 스레드 개수를 조절

세마포 (2/3) 세마포를 이용한 동기화 세마포를 생성. 이때 사용 가능한 자원의 개수로 리소스 카운트를 초기화 리소스를 사용할 스레드는 자신이 필요한 리소스 개수만큼 Lock()을 호출하며, Lock()이 성공할 때마다 리소스 카운트 값이 1씩 감소. 리소스 카운트가 0인 상태에서 Lock()을 호출하면 해당 스레드는 대기함. 리소스 사용을 마친 스레드는 자신이 사용한 리소스 개수만큼 Unlock()을 호출하며, 이때마다 리소스 카운트 값이 1씩 증가

세마포 (3/3) 세마포 생성 lInitialCount: 세마포의 초기값 lMaxCount: 세마포의 최대값 pstrName: 세마포 이름 lpsaAttribute: 보안 설명자와 핸들 상속 관련 구조체 CSemaphore::CSemaphore ( LONG lInitialCount = 1, LONG lMaxCount = 1, LPCTSTR pstrName = NULL, LPSECURITY_ATTRIBUTES lpsaAttributes = NULL );

CSingleLock 클래스 (1/2) 문제 발생 CMutex g_mutex(...); MyThread() { g_mutex.Lock(); // 예외 상황 발생 g_mutex.Unlock(); }

CSingleLock 클래스 (2/2) 해결 방법 CMutex g_mutex(...); MyThread() { CSingleLock lock(&g_mutex); lock.Lock(); // 예외 상황 발생 lock.Unlock(); }

CMultiLock 클래스 (1/2) 사용 예1 CEvent g_event[3]; CSyncObject* g_pSyncObjects[3] = { &g_event[0], &g_event[1], &g_event[2] }; MyThread() { CMultiLock multiLock(g_pSyncObjects, 3); multiLock.Lock(); ... }

CMultiLock 클래스 (2/2) 사용 예2 CEvent g_event[3]; CSyncObject* g_pSyncObjects[3] = { &g_event[0], &g_event[1], &g_event[2] }; MyThread() { CMultiLock multiLock(g_pSyncObjects, 3); multiLock.Lock(INFINITE, FALSE); ... }