Windows_/Windows32_API

Windows :: 스레드의 동기화

sosal 2014. 7. 24. 10:19
반응형

/*

 * http://sosal.kr/

 * made by so_Sal

 */

 

 

동기화  ::  작업들 사이의 수행 시기를 맞추는 것.
                사건이 동시에 일어나거나, 일정한 간격을 두고 일어나도록
                시간의 간격을 조정하는 것을 이른다.

임계영역 :: 둘이상의 스레드가 동시에 접근하는 위험요소를 지니는 코드 블럭
                 쉽게 동기화는 임계영역 위험요소에 의해 발생될 문제를 제거하는 것이라 할 수 있다.

그렇다면, 둘 이상의 스레드가 동시접근 하는것이 왜 위험요소인가?
간단히 예를 들겠습니다.
스레드 A와 B가 전역변수 int (0)를 1만큼 증가시킨다고 가정해보면.
스레드 A는 int (0)의 값을 가져와서 1을 증가시킨다음,
원래 int (0) 가 존재하는 메모리에 증가시킨 값(1)으로 int (1)를 대입합니다.

여기서 발생할 문제점은?

스레드 A가 int (0)의 값을 가져오는 동시에
B도 int (0)의 값을 가져옵니다.
스레드 A는 값을 증가시켜 원래 int (0)이 있는자리에
증가시킨값 int (1)을 대입합니다.

B는 int가 0에서 1로 증가되었다는 사실을 모른채,
A가 변화시키기 전의 값 (0)에서 1을 증가시킨후
int (1)의 값을 대입합니다.

원래 2가 되어야 할 int가 1이 되는 결과를 만듭니다.

위 문제를 해결하는 것 :: 동기화

동기화는 다양한 기법이 있습니다.



  유저모드 동기화         ::    LINK_

1. 크리티컬 섹션 기반 동기화
2. 인터락 함수 기반 동기화

  커널모드 동기화         ::    LINK_

mutex 기반 동기화
semaphor 기반 동기화
named 뮤텍스 기반 동기화
----------------- 위 3 동기화 기법은 메모리 동기화로 분류
event 기반 동기화
----------------- 실행순서 동기화로 분류


한순간에 하나의 스레드만 메모리에 접근하도록,
두개 이상의 스레드가 메모리에 동시 접근하지 않도록 막는것을
임계영역에 대한 메모리 접근 동기화
순서를 정해주는것 순서 동기화