이 글에서는 C++ 프로그램에서 사용자가 지정한 x 밀리초 동안 프로그램의 실행을 일시 중지(슬립)시키는 방법을 알아보겠습니다.
clock() 함수를 활용한 슬립 구현 원리
슬립 기능을 구현하는 방법은 다양한 라이브러리를 활용하는 것이 있지만, 여기서는 표준 라이브러리의 clock() 함수를 사용하겠습니다. clock() 함수는 프로그램 시작 이후 경과된 현재 CPU 시간을 반환합니다.
구현 아이디어는 다음과 같습니다. 먼저 현재 클록 값에 대기하고자 하는 밀리초(x)를 더해 종료 시간을 계산합니다. 그다음 현재 시간이 종료 시간에 도달할 때까지 빈 while 루프를 반복 실행하며 시간이 흐르기를 기다립니다. 이때 CLOCKS_PER_SEC 매크로를 사용하는데, 이 매크로는 1초당 클록 틱(clock tick)의 수를 나타내므로 밀리초 단위를 클록 단위로 변환하는 데 활용됩니다.
예제 코드
다음 코드를 통해 개념을 더 명확하게 이해할 수 있습니다.
#include <iostream>
#include <time.h>
using namespace std;
void sleepcp(int milli) {
// 크로스 플랫폼에서 동작하는 슬립 함수
clock_t end_time;
end_time = clock() + milli * CLOCKS_PER_SEC / 1000;
while (clock() < end_time) {
// 대기를 위한 빈 루프
}
}
int main() {
cout << "7초(7000밀리초) 카운터를 시작합니다" << endl;
sleepcp(7000);
cout << "타이머가 종료되었습니다" << endl;
}실행 결과
7초(7000밀리초) 카운터를 시작합니다 타이머가 종료되었습니다
프로그램을 실행하면 첫 번째 메시지가 출력된 후 정확히 7초(7000밀리초)가 경과한 뒤 두 번째 메시지가 출력되는 것을 확인할 수 있습니다.
참고: C++11 이후의 더 나은 대안
위 방식은 바쁜 대기(busy-waiting) 방식으로, 대기하는 동안 CPU 자원을 계속 소모한다는 단점이 있습니다. 따라서 실무 환경에서는 C++11부터 제공되는 <thread> 헤더의 std::this_thread::sleep_for()를 사용하는 것이 좋습니다. 이 함수는 스레드를 실제로 재워 CPU 부하 없이 지정한 시간만큼 대기할 수 있습니다.
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;
int main() {
cout << "3초 대기를 시작합니다" << endl;
this_thread::sleep_for(chrono::milliseconds(3000));
cout << "대기가 종료되었습니다" << endl;
return 0;
}요약하면, 간단한 학습용 구현에는 clock() 기반의 수동 대기 방식을 사용할 수 있지만, 실제 프로젝트에서는 std::this_thread::sleep_for()를 사용하는 것이 성능과 안정성 면에서 훨씬 유리합니다.