Atau ke usleep()
, yang tidak didefinisikan dalam POSIX 2008 (meskipun didefinisikan hingga POSIX 2004, dan ternyata tersedia di Linux dan platform lain dengan riwayat kepatuhan POSIX), standar POSIX 2008 mendefinisikan nanosleep()
:
nanosleep
- tidur beresolusi tinggi#include <time.h> int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
nanosleep()
fungsi akan menyebabkan utas saat ini ditangguhkan dari eksekusi hingga interval waktu yang ditentukan olehrqtp
argumen telah berlalu atau sinyal dikirim ke utas pemanggil, dan tindakannya adalah memanggil fungsi penangkap sinyal atau menghentikan proses. Waktu penangguhan mungkin lebih lama dari yang diminta karena nilai argumen dibulatkan ke atas menjadi kelipatan bilangan bulat dari resolusi tidur atau karena penjadwalan aktivitas lain oleh sistem. Namun, kecuali untuk kasus diinterupsi oleh sinyal, waktu penangguhan tidak boleh kurang dari waktu yang ditentukan olehrqtp
, yang diukur dengan jam sistem CLOCK_REALTIME.Penggunaan
nanosleep()
fungsi tidak berpengaruh pada tindakan atau pemblokiran sinyal apa pun.
Ya - standar POSIX lama mendefinisikan usleep()
, jadi ini tersedia di Linux:
int usleep(useconds_t usec);
DESKRIPSI
Fungsi usleep() menangguhkan eksekusi thread panggilan untuk (setidaknya) mikrodetik usec. Tidur dapat diperpanjang sedikit oleh aktivitas sistem apa pun atau oleh waktu yang dihabiskan untuk memproses panggilan atau oleh perincian pengatur waktu sistem.
usleep()
membutuhkan waktu mikrodetik , jadi Anda harus mengalikan masukan dengan 1000 untuk tidur dalam milidetik.
usleep()
sejak itu tidak digunakan lagi dan kemudian dihapus dari POSIX; untuk kode baru, nanosleep()
lebih disukai:
#include <time.h> int nanosleep(const struct timespec *req, struct timespec *rem);
DESKRIPSI
nanosleep()
menangguhkan eksekusi utas panggilan hingga setidaknya waktu yang ditentukan dalam*req
telah berlalu, atau pengiriman sinyal yang memicu pemanggilan penangan di utas pemanggilan atau yang menghentikan proses.Spesifikasi waktu struktur digunakan untuk menentukan interval waktu dengan presisi nanodetik. Ini didefinisikan sebagai berikut:
struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ };
Contoh msleep()
fungsi diimplementasikan menggunakan nanosleep()
, melanjutkan tidur jika terganggu oleh sinyal:
#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;
}
Anda dapat menggunakan fungsi lintas platform ini:
#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
}