barrier 알고리즘에서 unlock 위치 잠시 여쭐께요.

bily의 이미지

안녕하세요. 동기화쪽을 공부중인데, barrier에서 왜 이렇게 하는지

영 감이 안와서 질문드립니다.

보통, barrier 알고리즘은

struct bar_type {int counter;
struct lock_type lock;
int flag = 0;}
bar_name;

BARRIER (bar_name, p) {
LOCK(bar_name.lock);
if (bar_name.counter == 0)
bar_name.flag = 0;
mycount = bar_name.counter++;
UNLOCK(bar_name.lock);
if (mycount == p-1) {
bar_name.counter = 0;
bar_name.flag = 1;
}
else while (bar_name.flag == 0) {};
}

이렇게 쓰지만, 이 경우 barrier를 연속으로 두개 쓸경우에, 플래

그가 바뀐걸 미처 보지 못하고, 스케줄링 되었다가 먼저 쓰인

barrier에 갇혀 버리는 스레드가 발생할수 있게 됩니다.

그래서, 나온 알고리즘이, sense reversal 이라고 부르는..

BARRIER (bar_name, p) {
local_sense = !(local_sense);
LOCK(bar_name.lock);
mycount = bar_name.counter++;
if (bar_name.counter == p)
UNLOCK(bar_name.lock);
bar_name.flag = local_sense;
else
{ UNLOCK(bar_name.lock);
while (bar_name.flag != local_sense) {}; }
}

위의 알고리즘이 나오게 됩니다.

그런데, 제가 이해가 되지 않는것은 왜 UNLOCK 이

if (bar_name.counter == p)

구문 뒤에 수행이 되는지요?

mycount = bar_name.counter++;

뒤에 바로 UNLOCK 를 해도, 상관이 없는것 아닌가요?

괜히 했을리는 없고, 실제로 구글로 검색을 해보니, 어떤 강의 자료에서는 mycount = bar_name.counter++; 뒤에 바로 UNLOCK를 해버리는 것도 발견 했습니다.

LOCK(bar_name.lock);
mycount = bar_name.counter++;
UNLOCK(bar_name.lock);
if (bar_name.counter == p)
bar_name.flag = local_sense;
else
while (bar_name.flag != local_sense) {}; }

위의 코드와 차이점이 어떻게 되는지요?

고수님들의 한수 지도 부탁드립니다.