묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
CAS가 들어있는 반복문 관련 질의
// CAS는 automic하게 수행 while (_locked.compare_exchange_strong(expected, desired) == false) { // expected에 false를 대입하는 부분도 automic하게 수행? expected = false; }CAS 부분은 automic하게 수행되는 걸 이해했는데, expected에 false를 대입하는 부분도 CAS와 한 묶음으로 automic하게 수행될까요?그렇지 않다면, 어떤 쓰레드가 lock을 획득한 상태(_locked가 true)에서,A라는 쓰레드가 CAS 수행 후, expected가 true로 변경, 이어서 expected에 false를 대입하려다가 B라는 쓰레드가 CPU 점유.B라는 쓰레드는, expected가 true인 상태에서 CAS 수행 후, while문 탈출. 이미 다른 쓰레드가 접근하고 있는 critical section 접근 가능. 이라는 시나리오가 나올 수 있을 것 같은데, 어떤 부분이 잘못 생각하고 있는 지점일까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
number가 0이 안되는 상황이 이해가 않습니다.
public void Acquire() { while (_locked) // 화장실 문이 비어있을 때 까지 대기를 한다. { } // 들어가서 문을 잠그는 작업 _locked = true; } 이렇게 화장실에 들어가는 과정과 잠그는 과정이 달라서, 그 시간차 동안에 두 쓰레드가 동시에 공유 자원에 접근해서 number에 0이지 나오지 않는다고 설명해주셨습니다. 근데 이 설명이 잘 이해가 가지 않습니다. 위 코드에 화장실에 2명이 들어간다는 게 어떤 의미인가요? 제가 이해한 바로는 _locked이 false가 되어 while문을 빠져나왔을 때 다른 쓰레드도 Acquire함수에 접근하여, 두 쓰레드에서 _locked에 true를 대입하는 것으로 이해했습니다. 근데 이러한 이유 때문에 number++와 number-- 연산에서 에러가 나는 과정이 이해가 되지 않습니다. 결국 for문을 만번이든, 10만번이든 돈 다는 뜻은 number++ 혹은 nunber-- 연산을 했다는 뜻인데 왜 number에 0이 출력되지 않고 이상한 값이 출력되는지 잘 모르겠습니다. number++ 혹은 number-- 연산이 스킵이 되는 과정이 이해가 안갑니다.