Memory Model

Kimbab1004·2024년 1월 24일
0

Server

목록 보기
2/7

이전 flag 값을 prev에 넣고, flag 값을 수정 exchange

bool pre = flag.exchange(true);
{
	bool excepted = false;
	bool desired = true;
	flag.compare_exchange_strong(excepted, desired);

	//compare_exchage_strong 슈도코드
	if (flag == excepted) {
		flag = desired;
		return true;
	}
	else {
		excepted = flag;
 }

여러 Thread가 동일한 메모리에 동시에 접근할때 Thread중 1개가 데이터의 수정을 실행할 시 Race Condition이 일어난다.

이를 해결하기 위해
Mutex or Atomic 연산 사용

Atomic 연산이란?
동기화 기법을 모든 Thread가 동일 객체에 대해서 동일한 수정 순서를 갖게 한다.
하지만 이때 코드 재배치, 가기성 등에 문제가 발생한다. 이를 해결하기 위해 c++11 부터 지원한 기능이 Memory Model

Momory Model(정책)
1) Sequentially Consistent (seq_cst)
2) Acquire-Release (acquire, release)
3) Relaxed (relaxed)

엄격한순( 컴파일러 최적화 여지가 적다 = 직관성이 좋은거임)

1)Sequentially
2)Acquire-Release(release 이전 코드들이 release를 넘겨 재배치 되는 것을 방지 자기전 코드들의 순서는 상관안함)
3)Relaxed(가시성, 코드 재배치)

ready.store(true, memory_order::memory_order_seq_cst);

컴파일러 최적화 여지가 적은 seq_cst를 사용하겠다.

사실 모든 원자적 연산에는 seq_cst기본 설정이다.

그래서 특별히 추가해주지 않더라도 자동적으로 설정이 되니 걱정할 필요 없다.

0개의 댓글