visual studio에서 Debug모드와 Release모드로 구성할 수 있음
예제 코드
#include "pch.h"
#include <iostream>
#include <thread>
#include <Windows.h>
int i = 0;
int k = 0;
void Func1()
{
while (true)
{
if (i == 1) {
//std::cout << "Func1()" << std::endl;
k++;
}
}
}
void Func2()
{
while (true)
{
Sleep(1000);
std::cout << "Func2() " << k << std::endl;
i++;
i %= 2;
}
}
int main()
{
std::thread thread1(Func1);
std::thread thread2(Func2);
thread1.join();
thread2.join();
}
Release모드 결과
Debug모드 결과
왜 이런 결과가 나오냐 하면 visual studio 옵션에서 Release모드는 컴파일 최적화가 일어나게 설정이 돼있다. (옵션에서 변경 가능)
그래서 최적화가 될 때 무슨 일이 일어나냐?
컴파일러가 볼 때 사용하지 않는 부분을 삭제하게 됨
코드에서 i를 보면 멀티스레드로 값을 변경하고 있는 것을 볼 수 있음
하지만 컴파일러는 그것을 알지 못하는 것 같음
컴파일러가 보기에 i는 0의 값이 들어있는데 Func1에서 i == 1을 체크하고 있음
그럼 컴파일러가 발생하지 않는 코드로 인식해 해당 코드를 삭제하고 컴파일됨
아마도 실제 컴파일 결과는
void Func1()
{
while (true);
}
같은 모양으로 만들었을 것임
이런 일을 방지하기 위해선 volatile 키워드를 추가해주면 최적화 대상에서 배제됨
'개발 > C++' 카테고리의 다른 글
C++ const 키워드 (0) | 2019.06.09 |
---|---|
C++ shared_ptr 사용할 때 주의할 점 (0) | 2019.05.24 |
C++ 스마트 포인터 (0) | 2019.05.07 |
C++ Map, HashMap(unorder_map) 사용할 때 주의할 점 (0) | 2019.04.27 |
C++ 가상 소멸자 (feat. 상속 생성자 소멸자 호출순서) (0) | 2019.04.22 |