C++에서 시간 지연 추가

Muhammad Husnain 2023년10월12일
  1. sleep() 시스템 호출을 사용하여 C++에서 시간 지연 추가
  2. usleep() 함수를 사용하여 C++에서 시간 지연 추가
  3. sleep_for() 함수를 사용하여 C++에서 시간 지연 추가
  4. sleep_until() 함수를 사용하여 C++에서 시간 지연 추가
C++에서 시간 지연 추가

이 튜토리얼은 C++ 프로그램에 시간 지연을 추가하는 방법에 대한 간략한 가이드를 제공합니다.

이것은 C++ 라이브러리가 제공하는 일부 기능을 사용하여 여러 가지 방법으로 수행할 수 있습니다. 우리는 작업 데모와 함께 몇 가지 기능에 대해 논의할 것입니다.

컴퓨터 프로그램의 모든 프로세스, 작업 또는 스레드는 잠자기 상태가 되거나 비활성화될 수 있습니다. 이는 프로세스 실행이 절전 모드에 있는 동안 보류될 수 있음을 의미합니다.

휴면 간격이 만료되거나 신호 또는 중단으로 인해 실행이 재개되면 실행이 재개됩니다. 이를 위한 다양한 방법이 있습니다.

  1. sleep() 시스템 호출
  2. usleep() 메소드
  3. sleep_for() 메소드
  4. sleep_until() 메서드

sleep() 시스템 호출을 사용하여 C++에서 시간 지연 추가

sleep 시스템 호출은 프로그램(작업, 프로세스 또는 스레드)을 절전 모드로 전환할 수 있습니다. 일반적인 sleep 시스템 호출의 time 매개변수는 프로그램이 잠자기 또는 비활성 상태를 유지해야 하는 시간을 알려줍니다.

C++ 언어에는 sleep 기능이 없습니다. 이 기능은 Linux의 경우 unistd.h, Windows의 경우 Windows.h와 같은 운영 체제별 파일에 의해 제공됩니다.

Linux 또는 UNIX 운영 체제에서 sleep() 기능을 사용하려면 프로그램에 "unistd.h" 헤더 파일을 포함해야 합니다.

기능 프로토타입

unsigned sleep(unsigned seconds);

실행을 일시 중단해야 하는 매개변수 시간(초)이 소요되며 성공적으로 실행으로 돌아오면 0을 반환합니다. 중간에 절전 모드가 중단되면 총 시간에서 중단 시간을 뺀 시간이 반환됩니다.

예시:

#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#endif
#include <cstdlib>
#include <iostream>
using namespace std;

int main() {
  cout << "Before sleep call " << endl;
  cout.flush();
  sleep(9);
  cout << "After sleep call" << endl;

  return 0;
}

출력:

Before sleep call
After sleep call

출력에서 두 개의 명령문을 인쇄했습니다. 첫 번째 것을 인쇄한 후 컴파일러는 9초 동안 기다린 다음 다른 하나가 인쇄됩니다. 독자는 이 지연을 관찰하기 위해 프로그램을 실행해야 합니다.

usleep() 함수를 사용하여 C++에서 시간 지연 추가

헤더 unistd.h의 또 다른 기능은 usleep()이며, 이를 통해 설정된 시간 동안 프로그램 실행을 일시 중지할 수 있습니다. 동작은 앞서 설명한 sleep() 함수와 동일합니다.

usleep() 함수는 useconds microseconds 동안 또는 실행을 중단하는 신호가 전송될 때까지 호출자 스레드의 실행을 일시 중단합니다.

기능 프로토타입

int usleep(useconds_t useconds);

이 함수는 실행을 일시 중지하고 성공적으로 재개된 경우 0을 반환하고 일부 실패가 발생하면 -1을 반환해야 하는 마이크로초 수를 매개 변수로 사용합니다.

예시:

#include <unistd.h>

#include <cstdlib>
#include <iostream>
using namespace std;

int main() {
  cout << "Hello ";
  cout.flush();
  usleep(10000);
  cout << "World";
  cout << endl;

  return 0;
}

출력:

Before Usleep Call
After Usleep call

위의 코드 스니펫에서 볼 수 있듯이 두 명령문을 인쇄하는 사이에 10000마이크로초의 대기 시간을 제공했습니다.

C++ 11에서는 스레드를 잠자기 상태로 만들기 위한 특정 기능이 제공됩니다. 이 목적에는 sleep_forsleep_until의 두 가지 방법이 있습니다.

이 두 가지 방법에 대해 논의해 보겠습니다.

sleep_for() 함수를 사용하여 C++에서 시간 지연 추가

sleep_for() 함수는 <thread> 헤더에 정의되어 있습니다. sleep_for () 함수는 절전 기간에 지정된 기간 동안 현재 스레드의 실행을 일시 중단합니다.

일정 활동이나 자원 경합 지연으로 인해 이 기능은 제공된 기간보다 더 오래 차단될 수 있습니다.

기능 프로토타입

template <class Rep, class Period>
void sleep_for(const std::chrono::duration<Rep, Period>& sleep_duration);

예시:

#include <chrono>
#include <iostream>
#include <thread>
using namespace std;

int main() {
  cout << "Hello I'm here before waiting" << endl;
  this_thread::sleep_for(chrono::milliseconds(10000));
  cout << "I Waited for 10000 ms\n";
}

출력:

Hello I'm here before waiting
I Waited for 10000 ms

위의 코드 스니펫에서 메인 스레드를 10000밀리초 동안 잠자기 상태로 만들었습니다. 즉, 현재 스레드가 10000밀리초를 차단한 다음 실행을 재개합니다.

sleep_until() 함수를 사용하여 C++에서 시간 지연 추가

<thread> 헤더는 이 기능을 정의합니다. sleep_until () 메서드는 절전 시간이 지날 때까지 스레드 실행을 중지합니다.

이 기능은 일정 활동이나 자원 경합 지연으로 인해 다른 기능과 마찬가지로 지정된 시간보다 오래 차단될 수 있습니다.

기능 프로토타입

template <class Clock, class Duration>
void sleep_until(const std::chrono::time_point<Clock, Duration>& sleep_time);

스레드를 차단해야 하는 기간을 매개변수로 받아 아무 것도 반환하지 않습니다.

예시:

#include <chrono>
#include <iostream>
#include <thread>
using namespace std;

int main() {
  cout << "Hello I'm here before waiting" << endl;
  std::this_thread::sleep_until(std::chrono::system_clock::now()
                                    std::chrono::seconds(3));
  cout << "I Waited for 3 seconds\n";
}

출력:

Hello I'm here before waiting
I Waited for 2 seconds
Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn