usleep()
の代わりに 、これは POSIX 2008 では定義されていませんが (POSIX 2004 までは定義されていましたが、POSIX 準拠の歴史を持つ Linux やその他のプラットフォームで利用できることは明らかです)、POSIX 2008 標準では nanosleep()
を定義しています。 :
nanosleep
- 高解像度睡眠
#include <time.h>
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
nanosleep()
関数は、rqtp
で指定された時間間隔まで、現在のスレッドの実行を中断させます。 引数が経過したか、呼び出し元のスレッドにシグナルが配信され、そのアクションはシグナルをキャッチする関数を呼び出すか、プロセスを終了することです。中断時間は、引数値がスリープ解決の整数倍に切り上げられるか、システムによる他のアクティビティのスケジューリングのために、要求されたよりも長くなる場合があります。ただし、信号によって中断された場合を除き、中断時間は rqtp
で指定された時間より短くならないものとします。 、システム クロック CLOCK_REALTIME によって測定されます。
nanosleep()
の使用 関数は、信号の動作またはブロックに影響を与えません。
はい - 古い POSIX 標準で定義された usleep()
であるため、これは Linux で利用できます:
int usleep(useconds_t usec);
説明
usleep() 関数は、(少なくとも) usec マイクロ秒の間、呼び出しスレッドの実行を中断します。スリープは、システム アクティビティ、呼び出しの処理に費やされた時間、またはシステム タイマーの粒度によって、わずかに長くなる場合があります。
usleep()
マイクロ秒かかります であるため、ミリ秒単位でスリープするには、入力に 1000 を掛ける必要があります。
usleep()
その後廃止され、その後 POSIX から削除されました。新しいコードの場合、nanosleep()
推奨:
#include <time.h> int nanosleep(const struct timespec *req, struct timespec *rem);
説明
nanosleep()
少なくとも*req
で指定された時間まで、呼び出しスレッドの実行を中断します または、呼び出しスレッドでハンドラーの呼び出しをトリガーするか、プロセスを終了するシグナルの配信。構造体 timespec は、ナノ秒の精度で時間間隔を指定するために使用されます。以下のように定義されています:
struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ };
例 msleep()
nanosleep()
を使用して実装された関数 、信号によって中断された場合はスリープを継続します:
#include <time.h>
#include <errno.h>
/* msleep(): Sleep for the requested number of milliseconds. */
int msleep(long msec)
{
struct timespec ts;
int res;
if (msec < 0)
{
errno = EINVAL;
return -1;
}
ts.tv_sec = msec / 1000;
ts.tv_nsec = (msec % 1000) * 1000000;
do {
res = nanosleep(&ts, &ts);
} while (res && errno == EINTR);
return res;
}
このクロスプラットフォーム機能を使用できます:
#ifdef WIN32
#include <windows.h>
#elif _POSIX_C_SOURCE >= 199309L
#include <time.h> // for nanosleep
#else
#include <unistd.h> // for usleep
#endif
void sleep_ms(int milliseconds){ // cross-platform sleep function
#ifdef WIN32
Sleep(milliseconds);
#elif _POSIX_C_SOURCE >= 199309L
struct timespec ts;
ts.tv_sec = milliseconds / 1000;
ts.tv_nsec = (milliseconds % 1000) * 1000000;
nanosleep(&ts, NULL);
#else
if (milliseconds >= 1000)
sleep(milliseconds / 1000);
usleep((milliseconds % 1000) * 1000);
#endif
}