인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

yilee님의 프로필 이미지
yilee

작성한 질문수

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

메모리 모델

가시성과 코드 재배치에 관해서 문의드립니다.

작성

·

651

0

안녕하세요.

강사님... 멀티스레드 부분에서 나오는 개념이 어려워 나름의 생각 정리 후 맞는지 확인차 질의드립니다.

1) 동일한 객체에 대해 동일한 수정 순서를 보장한다.        만약 공유자원 A에 스레드 1, 2, 3이 지속적으로 접근
    한다고 할 때(Producer 처럼 while(true) { ... } 구조)
    특정 시점에 스레드 1이 A에 저장된 값을 읽었고
    바로 스레드 2가 A에 저장된 값을 읽었다면
    스레드 2가 공유자원 A에서 읽은 값은 적어도
    스레드 1이 공유자원 A에서 읽은 값을 포함하여
    이후 시점에 변경된 값이 읽혀진다.

2) 코드 재배치
   - 코드 재배치는 Cache에 의한 재배치,
     CPU 파이프라인에 의한 재배치가 있다.
     -> 단일 스레드에서는 코드 재배치가 이루어져도
         절차에 맞게 결과가 나왔지만, 멀티스레드일때는
         코드 재배치에 의해 원하는 결과가 나오지 않을
         수 있다. 

3) 가시성 보장이란
    - 스레드 1에서 공유 자원에 대한 값을 변경하고,
      바로 스레드 2가 공유 자원에 대한 값을 읽었을 때
      스레드 1에서 변경한 값이 읽혀지는 것
      (스레드 1의 캐시에서 메모리에 값을 반영한 것) 

4) lock_guard<mutex> lock(m);
   - 해당 코드도 결국에는 단일 스레드에서 동작하는 것
     과 동일하기에 원자성을 보장한다고 보아야 되는 것
     인지요 ?... 원자성을 보장한다면 동일 객체에 대한
     수정 순서를 보장한다고 보면 되는 것이 맞는지
     궁금합니다. (코드 재배치 문제는 별 문제가 안될
     거 같지만, 가시성은 보장하는지도 궁금해요 ㅠㅠ)

 

이정도로 해석해도 되는 부분인지요 ..  

답변 1

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

네 이해하신게 맞습니다.
락을 걸면 원자성, 수정 순서 보장 등 문제들도 해결이 됩니다.

yilee님의 프로필 이미지
yilee

작성한 질문수

질문하기