HOWTO · C++

C++ に時限遅延を追加

このチュートリアルでは、C++ プログラムに時限遅延を追加するための簡単なガイドを提供します。

このページの内容

このチュートリアルでは、C++ プログラムに時限遅延を追加するための簡単なガイドを提供します。

これは、C++ ライブラリが提供するいくつかの関数を使用してさまざまな方法で実行できます。いくつかの機能とその動作デモについて説明します。

コンピュータプログラム内のプロセス、タスク、またはスレッドは、スリープ状態になるか、非アクティブになる可能性があります。これは、プロセスの実行をスリープ状態の間保留できることを意味します。

スリープ間隔が満了するか、信号または中断によって実行が再開されると、実行が再開されます。この目的にはさまざまな方法があります。

  1. sleep() システム呼び出し
  2. usleep() メソッド
  3. sleep_for() メソッド
  4. sleep_until() メソッド

C++ で sleep() システム呼び出しを使用して時限遅延を追加する

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

出力には、2つのステートメントが出力されています。最初の 1つを印刷した後、コンパイラは 9 秒間待機してから、もう 1つを印刷します。読者は、この遅延を観察するためにプログラムを実行する必要があります。

C++ で usleep() 関数を使用して時限遅延を追加する

ヘッダーunistd.h のもう 1つの関数は、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

上記のコードスニペットでわかるように、2つのステートメントを出力する間に 10000 マイクロ秒の待機を提供しました。

C++ 11 では、スレッドをスリープ状態にするための特定の関数が提供されています。この目的には、sleep_forsleep_until の 2つの方法があります。

これらの 2つの方法について説明しましょう。

C++ で sleep_for() 関数を使用して時限遅延を追加する

関数 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 ミリ秒をブロックしてから、実行を再開することを意味します。

C++ で sleep_until() 関数を使用して時限遅延を追加する

<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