* VS 2015 update11130일에 나올 예정인데 이 버전에서는 고쳐질 수도 있다.

 

Visual C++2012, 2013, 2015 std::this_thread::sleep_for 함수는 내부에서  std::this_thread::sleep_until 함수를 호출하고 있다.

구체적으로 말하면 sleep_for 인수에 전달된 시간 값을 현재 시간에 더해서 절대 시간으로 변환하고, 그것을 sleep_until 함수의 인수로 전달하고 있다.

 

이 구현 방법에는 문제가 있다. sleep_for 함수 처리 도중에 다른 스레드와 다른 프로세스에 의해서 시간이 변경되면(OS의 시간을 변경하면) 정상적으로 동작하지 않는다.

예를 들어 현재 PC 시간이 10 0 0초이고, sleep_for 함수의 인수에 1초를 전달하고 이 처리 도중에 사용자가 PC 시간을 9 0 0초로 변경했다면 다음과 같이 동작한다.

 

1. sleep_for 함수 내에서 현재의 PC 시간 10 0 0초와 인수 값 1초를 더하여 절대 시간 10 0 1초를 만든다.

2. 여기에서 유저가 PC 시간을 9 0 0초로 변경.

3. sleep_until 함수에는 10 0 1초를 준다.

4. PC 시간이 10 0 1초때까지 1시간 0 1초간 sleep 하게 된다.

 

 

gcc에서 사용하는 libstdc++, clang/LLVM에서 사용하는 libc++에서 sleep_for 함수는 인수의 시간 값을 시각으로 변환하지 않고 그대로 시스템의 sleep 함수에 전달하고 있어서 VC++과 같은 문제는 일어나지 않는다.

sleep_until 함수를 직접 호출한 경우는 동등한 문제가 생길 수 있지만 이 함수는 원래 특정 시간까지 대기하기 위한 함수이므로 용도 외에 사용하지 않는 한은 단순히 쓴 대로 움직인다.

 

 

출처: http://www.ruche-home.net/boyaki/2015-11-11/VCsleep_

 

by 흥배 2015.11.23 08:00