C++ 11
에서 업데이트된 것 중 제일 중요한 점은 메모리 모델에 대한 내용이 확립된 점 같다.
Memory model (정책) 에서 우리가 넣어주는 여러 옵션이 이렇게 크게는 3가지로 분류할 수 있다.
1) Sequentially Consistent (seq_cst ; 일관성이 있다)
2) Acquire-Release (acquire, release, acq_rel)
3) Relaxed (relaxed)
간단히 살펴보자면 아래와 같다. 정책에 따라 가시성과 코드 재배치 문제의 해결 여부에 있어서 차이가 있다.
1) seq_cst : 가장 엄격하다. 컴파일러 최적화 여지가 적다. 직관적이다. 기본 옵션이다!
2) acquire-release
3) relaxed : 자유롭다. 컴파일러 최적화 여지가 많다. 직관적이지 않다.
여러 쓰레드가 동일한 메모리가 동시 접근, 그 중에서도 write
연산을 하면
Undefined Behavior
라는 언어 차원에서 보증할 수 없는 상황이 발생한다.공유 자원에 동시 접근하게 되면 2가지 방법을 선택할 수 있다.
1) Lock (표준 뮤텍스) 을 걸어서 상호 배타적으로 접근해서
2) atomic 한 연산 (all or nothing) 으로 해결할 수 있다.
int main()
{
atomic<bool> flag = false;
// flag.is_lock_free(); // false 라면 락을 걸어야 한다는 뜻
flag.store(true, memory_order::memory_order_seq_cst);
bool val = flag.load(memory_order::memory_order_seq_cst);
}