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