Atomic Operation 으로 하는 동시성 제어

Test-And-Set (TAS)

TAS 를 이용해서 간단한 동시성 제어를 할 수 있다. testAndSet 이라는 function 을 가지고 아래의 do...while 문을 쓰레드 A, B 에서 동시에 호출한다고 해 보자. 이 때 lock 은 같은 변수이다.

우선 TestAndSet() 은 다음과 같은 일을 한다. 말 그대로 ‘지금 값이 무엇인지 검사하고, 값을 바꾼다’ 는 것이다.

더 읽어보기

pthread_mutex_unlock() 중복 호출

pthread_mutex_unlock() 을 호출하면, pthread_mutex의 멤버 변수 중 하나인 __nusers 값이 1에서 0으로 감소한다. 이 상태에서 다시 unlock()을 호출하면? 0에서 -1로 감소해야 하는데, 여기까지는 정의되지 않았다. 따라서 unsigned 변수인 __nusers 값은 -1이 아니라 2**32-1 가 된다. 이는 pthread_mutex_destroy() 에서 ‘아직 사용 중인 thread가 있는데?’ 라고 오해를 사기 딱 좋은 상황이 된다. 개발자는 분명히 ‘이 때쯤엔 pthread_mutex 에 접근할 thread는 없을 것이야’ 라고 생각했을 것이고, 실제로도 그렇지만 말이다. 그래서 destroy() 에서는 EBUSY 에러가 나게 된다.

따라서, pthread_mutex가 이미 unlock되었다면 unlock() 함수를 호출하지 않도록 해야 한다.

더 읽어보기