C++ 멀티쓰레드 기초적인 부분 간단 정리
쓰레드 생성
Win32 API에서는 CreateThead()함수를 사용한다
일반적으로 윈도우환경에서 process.h 헤더를 인클루드해주고 _beginthreadex()를 많이 쓴다(_beginthread() 함수의 단점을 보완한 함수)
일반적인 _beginthreadex() 함수는 HANDLE값을 리턴하며 쓰레드의 함수가 끝날때는 _endthreadex()를 호출해주는 것 대신 return만 해줘도 된다
리눅스에서는 pThread를 사용하는데 윈도우에서도 라이브러리만 설치하면 똑같이 사용가능하다고 한다
정확히 기억나지 않는데 C++11부터였나? OS와는 상관없이 사용할 수 있는 thread.h 헤더에 스레드 관련 라이브러리가 추가되어 이를 사용하여 새로운 쓰레드를 만들 수도 있다.
참고 사이트들
http://blog.naver.com/limsk112/70107328764
유저 모드와 커널모드에 대해서 퍼온다면...
메모리 영역은 사용자에 의해서 할당되는 메모리 공간인 유저 영역과 운영체제라는 하나의 소프트웨어를 실행시키기 위해서 필요한 메모리 공간인 커널 영역으로 나뉜다.
사용자가 사용하는 메모리 영역은 유저 영역이지만 C언어는 메모리 참조가 용이하기 때문에 안정성 제공 측면에서 커널 모드와 유저 모드가 사용된다.
기본적으로 유저 모드로 동작하다가 Windows 커널이 실행되어야 하는 경우에 커널 모드로의 전환이 일어난다
모드 전환시 시스템에 부담을 줄 수 있다
[출처] 커널 레벨(Kernel Level) 쓰레드와 유저 레벨(User Level) 쓰레드|작성자 cmw1728
유저모드
일반적인 프로그램의 실행 모드, 시스템 리소스로의 접근이 허용되지 않는다.
커널모드에 비해 속도가 빠르다
유저모드로 크리티컬 섹션이 있다.
커널모드
시스템 리소스로의 접근을 위한 프로세스의 실행 모드, 커널 오브젝트를 통한 시스템 리소스로(File, Thread 등등)의 접근 시 유저모드에서 커널 모드로의 변환이 발생한다.
뮤텍스, 이벤트, 세마포어 등이 커널모드이다.
참고 사이트
http://blog.naver.com/cmw1728/220475950348
EnterCriticalSection(); - 키를 가지고 들어간다
LeaveCriticalSection(); - 키를 가지고 나온다
DeleteCriticalSection(); - 키를 없앤다
윈도우의 이벤트를 생각하면 이해하기 쉽다.
CreateEvent() 함수로 이벤트 핸들을 만든다
두번째 인자를 false로 하면 함수가 끝나면 자동으로 reset()이 되고 true이면 수동으로 SetEvent()와 ResetEvent()로 signaled과 non-signaled을 설정해줘야한다
SetEvent()는 signaled로 전환함
ResetEvent()는 non-signaled로 전환함
동기화 기법 전체 참고
http://blog.naver.com/tjddk417/150083792429
(네이버 블로그 - 2016.02.14. 23:19)
'Programming > C++' 카테고리의 다른 글
VS2019 모던 C++ 마소 문서 (0) | 2019.05.02 |
---|---|
멀티쓰레드 세마포어 연습 (0) | 2016.03.07 |
멀티쓰레드 이벤트 연습 (0) | 2016.03.07 |
멀티쓰레드 뮤텍스 연습 (0) | 2016.03.07 |
멀티쓰레드 크리티컬 섹션 연습 (0) | 2016.03.07 |