반응형

스레드 동기화는 왜 필요한가?

멀티스레를 이용하는 프로그램에서 스레드 2개 이상이

공유데이터에 접근하면 다양한 문제가 발생할 수 있기 때문이다.

 

스레드 동기화 기법

종류 기능
임계 영역(critical Section) 공유 자원에 대해 오직 한 스레드의 접근만 허용
(한 프로세스에 속한 스레드 간에만 사용 가능)
뮤텍스(mutex) 공유 자원에 대해 오직 한 스레드의 접근만 허용
(서로 다른 프로세스에 속한 스레드 간에도 사용 가능)
이벤트(event) 사건 발생을 알려 대기 중인 스레드를 깨운다.
세마포어(semaphore) 한정된 개수의 자원에 여러 스레드가 접근할 때,
자원을 사용할 수 있는 스레드 개수 제한
대기 가능 타이머(waitable timer) 정해진 시간이 되면 대기중인 스레드를 깨운다.

 

스레드 동기화가 필요한 상황

1. 둘 이상의 스레드가 공유 자원에 접근한다.

2. 한 스레드가 작업을 완료한 후, 기다리고 있는 다른 스레드에 알려준다.

 

두 경우 모두 각 스레드가 독립적으로 실행하지 않고 다른 스레드와의 상호 작용을 토대로

자신의 작업을 진행한다는 특징이 있다.

스레드 동기화를 하려면 동시에 진행하면 안되는 상황이 있을 때, 두 스레드는 매개체를 통해 진행 가능 여부를 판단하고 이에 근거해 자신의 실행을 계속할지를 정한다.

 

동기화 객체(synchronization)의 특징

1. Create*() 함수를 호출하면 커널 메모리 영역에 동기화 객체가 생성되고, 이에 접근할 수 있는 핸들이 리턴된다.

2. 평소에는 비신호상태로 있다가 특정 조건이 만족되면 신호 상태가 된다.

비신호 상태에서 신호 상태로 변화 여부는 Wait*()함수를 사용해 감지할 수 있다.

3. 사용이 끝나면 CloseHandle()함수를 호출한다.

* Wait()함수는 스레드 동기화를 위한 필수 함수

 

참고 출처

TCP/IP 윈도우 소켓 프로그래밍 『김선우 저』

반응형

'Etc > 소켓 프로그래밍' 카테고리의 다른 글

임계영역(Critical Section)  (0) 2020.08.31

+ Recent posts