WinCNT

동기화 방법들 본문

게임 프로그래밍(학습 내용 정리)/시스템 프로그래밍

동기화 방법들

WinCNT_SSS 2022. 4. 8. 12:44

네트워크 프로그래밍

연결 여부 --> TCP

데이터 송수신 --> TCP/UDP

1. 비동기식 --> OS가 APP에게 전달함

어떻게?

Windows OS의 특성을 이용 --> WM 메시지로 알려줌

 

조금 더 범용적인 방식: 이벤트 방식
Windows OS의 Event 커널 객체 --> 소켓 신호를 이벤트로 받겠다
(Linux에서도 비슷한 방식이 존재함)

 

Windows OS 성능의 극대화: IOCP + 오버랩드 I/O

오버랩드 I/O라는 구조체를 이용해서 CP(Complete Port)로 주고 받음
(CP 이외에도 콜백이나 이벤트로도 받을 수는 있다 - 옛날 방식)

 

2. 동기식 --> APP가 계속 기다림

 

동기화 방법들

https://docs.microsoft.com/en-us/windows/win32/sync/using-synchronization

 

Using Synchronization - Win32 apps

The following examples demonstrate how to use the synchronization objects:

docs.microsoft.com

WaitForMultipleObjects

메인 스레드든 워커 스레드든 있기만 하면 동기화가 걸린다

DWORD WaitForMultipleObjects(
  [in] DWORD        nCount,
  [in] const HANDLE *lpHandles,
  [in] BOOL         bWaitAll,
  [in] DWORD        dwMilliseconds
);

bWaitAll은 시느널이 모두 OK냐, 하나라도 OK냐로 결정하는 것

 

이벤트가 2개일 경우의 이벤트 처리

    switch (dwEvent) 
    { 
        // ghEvents[0] was signaled
        case WAIT_OBJECT_0 + 0: 
            // TODO: Perform tasks required by this event
            printf("First event was signaled.\n");
            break; 

        // ghEvents[1] was signaled
        case WAIT_OBJECT_0 + 1: 
            // TODO: Perform tasks required by this event
            printf("Second event was signaled.\n");
            break; 

        case WAIT_TIMEOUT:
            printf("Wait timed out.\n");
            break;

        // Return value is invalid.
        default: 
            printf("Wait error: %d\n", GetLastError()); 
            ExitProcess(0); 
    }

Event Objects

Mutex Objects

생성 자체가 하나의 객체

SetEvent 등에는 없다

하지만 뮤텍스는 스레드 동기화에서는 잘 안 쓴다

Semaphore Objects

 Mutext와 비슷하지만 Count로 관리한다

Singly Linked Lists

좋아는 보인다

단, Interlocked 계열의 함수를 사용하므로 메모리 정렬을 잘 해야 한다
()aligned_malloc / _aligned_free 등)

Timer Queues

타이머를 만들기 귀찮으니 사용하는 것도 좋을지도...?

병렬 컨테이너 및 개체(Parallel Containers and Objects)

https://docs.microsoft.com/ko-kr/cpp/parallel/concrt/parallel-containers-and-objects?view=msvc-170 

 

병렬 컨테이너 및 개체

자세한 정보: 병렬 컨테이너 및 개체

docs.microsoft.com

동시성, 병렬성?

동시성 - 작업을 나눠서 돌아가면서 수행, 마지막에 합쳐주는 처리가 필요

병렬성 - 하드웨어의 지원을 전제로, 물리적으로 동시에 작업을 수행

TBB

스레딩 빌딩 블록(Threading Building Blocks, TBB)
다중 코어 프로세서의 이점을 취하는 소프트웨어 프로그램을 작성할 목적으로
인텔이 개발한 C++ 템플릿 라이브러리(병렬 프로그래밍을 위한 구성 요소들의 집합)

유저 레벨 (크리티컬 섹션)

Critical Section Objects - Win32 apps | Microsoft Docs
mutex Class (C++ Standard Library) | Microsoft Docs
<mutex> | Microsoft Docs

위의 3개 모두 다르다...

 

SSS