본문 바로가기

MultiThread6

APC와 Alertable wait 상태에 대한 정리 최근 Overlapped IO 모델에 대해 강의를 듣는 도중 스레드의 Alertable Wait 이라는 상태에 대해 듣게 되었다. Overlapped 모델에 대한 내용이 주 였기 때문에 구체적인 설명은 듣지 못하였기에, 글을 쓰며 해당 내용에 조금 정리해보는 시간을 가지려한다. 스레드의 Alertable Wait 상태에 대해서 알기 위해서는 일단 APC에 대해서 이해해야한다. APC는 Asynchronous Procedure Call의 약자로서, 우리가 일반적으로 아는 함수 호출이 Synchronous Procedure Call 이었다면 반대로 비동기적으로 실행되는 함수호출을 의미한다. APC 함수의 형식은 다음과 같다 VOID CALLBACK APCProc(ULONG_PTR dwParam); 우리가 일.. 2021. 12. 29.
Reader Writer Lock 구현 지금까지 공부한 Lock은 모든 작업에 대해 배타적인(한 스레드가 사용중에는 접근을 허용하지 않는) 사용방식을 사용했다. 하지만 다중 스레드 환경에서는 쓰기작업(Write)이 이루어지는 동안 읽기(Read)작업을 허용해주어야 하는 경우가 있다. 또한 동일한 스레드가 recursive lock을 수행하는 경우에도 동일한 스레드에 대해 잠궜던 영역에 대해 접근을 허용해 주어야한다. 이를 가능케 하는 Reader Writer Lock에 대해 정리해본다. Reader Writer Lock을 구현하는데에 있어서 가장 중요한 부분은 멀티 쓰레드 환경에서 Reader 스레드와 Writer 스레드를 구분하는 일이다. 해당 Lock 구현에서는 이를 해결하기 위해 lock flag를 활용한다. class Lock { en.. 2021. 12. 13.
기초적인 Lock Free Stack 구현 앞서 공부했던 CAS(Compare And Swap) 을 기반으로 Lock Free Stack을 실습해보았다. Lock Free는 커널세션의 높은 오버헤드를 가지는 mutex와 Lock을 이용하지않고 Atomic 연산을 통해 멀티스레드 환경에서 이용가능한 오브젝트를 구현하는 방법이다. Lock Free에 있어서 여러 구현 방법이 있지만 가장 기초적이고 직관적인 방법으로 만들어진 Lock Free Stack을 소개한다, 구현한 Lock Free Stack은 Push, Pop 두 가지 메인 함수를 기반으로 부수적인 헬퍼 함수들을 구현하였다. Push의 경우 크게 어려운 부분이 없으나.Pop 함수에서 멀티스레드 환경을 고려해 작업중인 타 스레드들을 고려해 할당되었던 메모리를 해제하는데 많은 고려가 필요하다. .. 2021. 12. 3.
이벤트 방식 Lock 구현 (Condition Variable, Window API) Lock을 구현하는 여러 방법 중 이번엔 Event 기반의 Lock이다. sleep과 Event를 응용한다. Event 방식은 OS에게 커널오브젝트를 넘겨 해당 Lock이 풀렸을 때 signal을 보내고 작업을 기다리는 스레드들은 waitForSingleObject함수를 통해 signal을 받아 동작한다. // GameServer.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include "pch.h" #include #include #include #include #include // for event mutex m; queue q; HANDLE handle; void Producer(.. 2021. 11. 4.