barrier 알고리즘에서 unlock 위치 잠시 여쭐께요.
안녕하세요. 동기화쪽을 공부중인데, 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) {}; }
위의 코드와 차이점이 어떻게 되는지요?
고수님들의 한수 지도 부탁드립니다.
댓글 달기