SERVER/Windows2024. 3. 6. 02:04요청한 I/O작업 취소하기 - CancelIo, CancelIoEx

I/O 요청을 등록하고, 디바이스 드라이버가 I/O 요청을 처리하기 이전에 앞서 요청했던 I/O 작업을 취소하고 싶을 수있다. 윈도우에서는 이를 위해 CancleIo와 CancleIoEx 함수를 제공한다. CancleIo BOOL WINAPI CancelIo( _In_ HANDLE hFile ); 지정된 핸들에 대해 진행 중인 I/O작업이 있고, 해당 함수를 호출 하는 스레드에서 실행된 경우 CancleIo 함수는 이를 취소한다. I/O작업은 Overlapped I/O로 실행될때만 유효하다. 취소된 모든 I/O작업은 ERROR_OPERATION_ABORTED를 포함하여 완료되며, I/O 작업에 대한 모든 완료통지는 정상적으로 발생한다. 해당 함수는 핸들이 IOCP와 연계되어 있는 경우 사용하기 힘들다. ..

SERVER/Multi-Thread2024. 3. 4. 21:47SRWLock전용 LockGuard 제작하기

lock_guard std::lock_guard - cppreference.com template class lock_guard; (since C++11) The class lock_guard is a mutex wrapper that provides a convenient RAII-style mechanism for owning a mutex for the duration of a scoped block. When a lock_guard object is created, it attempts to take en.cppreference.com lock_guard란 c++11 부터 제공되는 클래스이다. C++의 RAII(Resource Aquisition Is Initailiza..

SERVER/Multi-Thread2024. 2. 12. 16:41스레드의 생성과 종료(_beginthreadex, _endthreadex 소스코드 분석)

쓰레드 생성 CreateThread HANDLE CreateThread( [in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes, [in] SIZE_T dwStackSize, [in] LPTHREAD_START_ROUTINE lpStartAddress, [in, optional] __drv_aliasesMem LPVOID lpParameter, [in] DWORD dwCreationFlags, [out, optional] LPDWORD lpThreadId ) dwStatckSize 스레드 스택의 크기 프로세스가 시작되면 내부적으로 CreateThread 함수를 호출하여 프로세스의 주 스레드를 초기화한다. 이때, CreateProcess는 실행 파일 내부에 저장..

[Effective C++] 2. #define을 쓰려거든 const, enum, inline을 떠올리자.
C++/Effective C++2022. 11. 8. 20:34[Effective C++] 2. #define을 쓰려거든 const, enum, inline을 떠올리자.

Effective C++ 3rd Edition. Scott Meyers. C++ 프로그래머의 필독서라고 불리는 Effective C++을 읽고 중요한 내용을 정리한 글 입니다. Item2. #define을 쓰려거든 const, enum, inline을 떠올리자. 🔻#define보다는 const, enum item이름을 다른 말로 해보면 "가급적 전처리기보다는 컴파일러를 더 가까이 하자"라고 할 수 있다. #define ASPECT_RATIO 1.653 위와 같은 코드를 썻을 때, 우리는 ASPECT_RATIO가 Symbolic name으로 보이지만, 소스코드가 컴파일러에게 넘어가기 이전에 전처리기가 해당 글자를 숫자 상수로 바꾸어버리기 때문에 컴파일러의 입장에서는 전혀 보이지 않는다. 그렇기때문에 해당 ..

[Thread] 스핀락(SpinLock)
SERVER/Multi-Thread2022. 9. 3. 17:53[Thread] 스핀락(SpinLock)

여러개의 스레드가 공유자원을 쓰고있을 때, 해당 공유자원이 있는 임계 영역(Critical Section)에 동시에 접근하게 되면, 공유 자원에 대한 접근이 어떤 순서로 이루어졌는지에 따라 실행 결과가 같지 않고 실행할때 마다 달라지는 경쟁 상태(Race Condition)이 발생하게 된다. 따라서 해당 문제를 해결하기 위해 한 스레드가 임계 영역에 접근하면 다른 스레드들은 이 스레드가 이용하는 동안 해당 임계영역에 접근 할 수 없도록, 즉 두 개 이상의 프로세스가 동시에 임계영역에 접근하는 것을 막하야하는데, 이를 상호 배제(Mutual Exclusion)라고 한다. 상호배제는 Lock을 통해 달성할 수 있는데, 이 글에서는 Lock을 구현하는 여러가지 방법중 스핀락(SpinLock)에 대해서 알아보고..

[알고리즘] 다익스트라 알고리즘(Dijikstra's Algorithm)
CS/Algorithm2022. 3. 18. 18:13[알고리즘] 다익스트라 알고리즘(Dijikstra's Algorithm)

🔻다익스트라 알고리즘(Dijikstra's Algorithm) 다익스트라 알고리즘이란 가중치 그래프에서 한 정점으로부터 모든 정점의 최단거리를 구하는 알고리즘이다. 다익스트라의 경우 가중치에 음수가 존재하면 안된다는 제약사항이 존재한다. 🔶다익스트라 알고리즘의 원리 다익스트라 알고리즘의 기본적인 원리는 굉장히 간단하다. 두가지 작업을 모든 정점을 모두 방문할 때까지 반복하는 것이다. 1. 방문하지 않은 정점 중 가장 cost가 작은 정점을 방문한다. 2. 해당 정점과 연결된 정정들 중에서 거리가 이전에 기록한 값보다 작다면 값을 갱신한다 이 두작업을 무한 반복하는 것인데, 글로만 보면 무슨 말인지 이해하기 힘들 수 있으니 그림을 통해 알아보자. 6개의 정점이 있고 각 정점사이의 cost가 그림과 같은 그..

image