* 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

sleep_for sleep_until 함수는 스레드를 일시 중지 시킬 때 사용하는 것입니다.

이 두 함수의 차이는 이름에서 쉽게 알 수 있는데 sleep_for는 특정 시간 동안 일시 중지 시키고 싶을 때(. 6초 동안 중지) 사용하고, sleep_until는 어떤 시간이 될 때까지(. 1410분까지) 중지 시킬 때 사용합니다.

 

sleep_for sleep_until 함수는 thread의 멤버는 아니고 this_thread 네임 스페이스에 속해 있습니다.

 

< 예제. 8 >

#include <iostream>

#include <chrono>

#include <thread>

 

int main()

{

           std::cout << "sleep_for 테스트 시작" << std::endl;

   

           std::chrono::seconds dura( 3 );

   

 

           std::chrono::system_clock::time_point StartTime = std::chrono::system_clock::now();

 

           std::this_thread::sleep_for( dura );

   

           std::chrono::system_clock::time_point EndTime = std::chrono::system_clock::now();

 

           std::chrono::seconds sec = std::chrono::duration_cast<std::chrono::seconds>(EndTime - StartTime);

          

           std::cout << "경과 시간()" << sec.count() << std::endl;

 

 

 

          

           std::cout << "sleep_until 테스트 시작" << std::endl;

 

           StartTime = std::chrono::system_clock::now();

 

           std::chrono::seconds dura_sec( 5 );

           std::this_thread::sleep_until( StartTime + dura_sec );

          

           EndTime = std::chrono::system_clock::now();

 

           sec = std::chrono::duration_cast<std::chrono::seconds>(EndTime - StartTime);

          

           std::cout << "경과 시간()" << sec.count() << std::endl;

}

 

< 실행 결과 > 


 

yield는 스레드가 자신에게 할당 되어 있는 시간을 포기하고 다른 실행 스레드에게 처리를 양도합니다.

std::this_thread::yield();

저작자 표시
신고
by 흥배 2013.05.20 08:00
| 1 |

티스토리 툴바