하아찡

[C++] 메모리 모델 본문

C++/추가공부

[C++] 메모리 모델

하아찡 2024. 12. 27. 23:37

C++ 11에서 메모리 모델에 대한 내용이 확립이 됐습니다.

일단 바로 Memory Model 정책에 대한 옵션을 먼저 알아보겠습니다.

1. Sequentially Consistent (seq_cst)

2. Acquire-Release(acuire, release)

3. Relaxed(relaxed)

 

차이점이 무엇이 있냐.

1번은 엄격하게 처리를 하게됩니다. 엄격한게 무엇이냐? 컴파일러 최적화 여지를 적게줍니다. 즉 직관적으로 볼수 있습니다.

2번은 보통

3번은 자유롭습니다. 즉 컴파일러 최적화 여지가 많습니다.대신 여지가 많은 만큼 직관적이지 못합니다.

 

일반적으로 그냥 사용하게되면 1번으로 설정이 됐습니다.

 

#include "pch.h"
#include <thread>
#include <atomic>
#include <mutex>
#include <Windows.h>
#include <condition_variable>
#include <vector>


atomic<int64> num;
mutex m;
void Thraed_1() {
    while (true) {
        num.fetch_add(1);
        cout << "현재값 : " << num.load() << endl;
        this_thread::sleep_for(100ms);
    }
}
void Thread_View() {
    while (true) {
        std::cout << "보는시점: " << num.load() << std::endl;
        this_thread::sleep_for(100ms);
    }
}
int main()
{
    
    vector<std::thread> t;
    std::thread t2(Thread_View);
    for (int32 i = 0; i < 4; i++) {
        t.push_back(std::thread(Thraed_1) );
    }
    
    for (auto& th : t) {
        th.join();
    }
    t2.join();

}

 

 

일단 해당 코드는 정확하지 않습니다. 가시성을 보기위해 만들었습니다.

과연 내가 보고있는값이 정확한건지? 그래서 값을 넣는 시점에서 출력과 가끔씩 값을 봤을때 과연 내가본 값이 마지막 값이 맞는지? 를 확인하기 위한 코드입니다.

 

일단 이미지 먼저 보고가시죠

예시를 들면 이겁니다.

만약에 우리가 위 그림처럼 값이 있어서 7까지 값을 봤다고 칩니다.

근데 현재값은 11까지 처리가 됐는데, 우리가 만약에 다음에 값을 확인하면 11이라는 값이 나올까요? 

정상적이면 다음에 봤을때 11이라는 값을 봐야하는데, 막상 처리하고보면 8, 9, 10, 11중에 하나가 나오게 됩니다.

하지만 값은 11까지 처리가 됐죠.

참 이상합니다. 우리가 봐왔던 모든게 거짓말같은 이런상황...

 

그러면 실제로 위 코드를 실행시킨 실행화면을 보시죠.

 

사실 결과값이 그렇게 깔끔하게 나온편은 아닙니다. 그냥 확인하고싶어서 만들었거든요...

위 이미즈를 봤을때 보는시점이 겹친 두부분을 보면 현재값은 172까지 처리가 됐지만 보는시점에서 값이 168과 그다음에 172의 값이 처리되는 모습을 봤습니다.

즉 해당 보는 시점이 위에서 그림으로 표현했던 빨간선의 위치입니다.

저기 보는시점 2개 겹친부분을 보면

현재값이 172가 최대인 상황에서도 168를 보고 172의 값을 볼 수 있는 상황이 생긴겁니다.

반응형

'C++ > 추가공부' 카테고리의 다른 글

[C++ 11] condition variable(조건 변수)  (0) 2024.12.27
[C++] Event  (0) 2024.12.27
[C++ 11] SleepLock  (1) 2024.12.27
[C++ 11]std::atomic, SpinLock  (1) 2024.12.27
Volatile 예약어  (0) 2024.10.30