inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

Lock-Free Stack #2 01:16쯤에 말씀하신 동시에 TryPop() 할 경우..질문입니다.

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

안녕하세요! 동시에 TryPop() 을 할 경우, oldHead 를 참조하는 스레드가 있을 수 있고 이 때 무작정 해제해버리면 use after delete 오류가 발생할 수 있다고 하셨습니다. TryDelete() 함수를 구현하실 때, 1 == popCount 안에서 delete old_head 를 할 때는 이미 분리했으니까 괜찮다고 하셨는데요. 첫 문단에서 언급한 부분과 반대되는 말을 하신 것 같다는 느낌을 받았습니다. 제가 생각했을 때는, 저희 수업 때 사용하신 예제 코드에서는, cas 연산을 통해 oldHead 를 분리했기 때문에 use after delete 오류가 안 날 것 같단 생각이 들더라고요. 궁금해서 테스트를 해봤습니다. TryDelete() 함수를 호출하지 않고 바로 delete old_head; 를 호출하는 코드를 넣었고요, 지금 이 질문을 올리고 있는 와중에 push() 는 sleep_for(1ms) 를 주고 pop() 을 하는 스레드는 5개를 돌려서, 진단 도구에서 확인되는 프로세스 메모리가 1mb이 유지되게 설정해서 30분 넘게 돌려보고 있습니다. 오류가 안 나고 있는 광경을 목격 중입니다. 그냥 운이 좋은 걸까요? 오류가 발생하지 않는 이유는 다음과 같다 생각합니다. atomic 변수인 head 에서 cas 연산을 하기 때문에 간발의 차이로 먼저 다음 코드를 통과한 스레드가 획득한 oldHead 는 다른 스레드가 이후에 될 oldHead 와 같지 않다. while 조건에서 true를 반환하는 순간 head 는 head 의 next 를 가리키고 있게 되기 때문이다. compare_exchange_weak() 함수가 true를 반환하면 head 는 원자적으로 head->next 를 가리키는 상태가 된다. while (old && false == _head.compare_exchange_weak(old, old->next)) return false; 고견 부탁드립니다. 멋진 강의 감사합니다.

  • 네트워크
  • MMORPG
  • windows-server
  • 락프리
  • lock-free
  • cas
literate_t 댓글 2 좋아요 0 조회수 222

인기 태그

인프런 TOP Writers

주간 인기글