C言語のusleep
は引数の時間通り待つわけではない。引数に渡された時間は最低待つだけ。
下限しか指定できないため、usleep(100)
のように呼び出した場合、100マイクロ秒待つのか、110マイクロ秒待つのかはコンピュータの使用状況によってまちまちである。
指定時間ぴったりで待ちたいときはどう実装したら良いか。
小さな時間で小刻みに待つ方法もあるが、CPUが無駄に起こされてしまう。
というわけで、考えたのが以下の実装。
#include <unistd.h>
#include <sys/time.h>
useconds_t get_time(void) {
struct timeval tv;
gettimeofday(&tv, NULL);
return ((tv.tv_sec * 1000) + (tv.tv_usec / 1000));
}
void Usleep(useconds_t microseconds) {
useconds_t endtime, lefttime;
endtime = get_time() + microseconds;
while ((lefttime = endtime - get_time()) > 0) {
usleep(lefttime / 2);
}
}
待つべき残り時間の1/2ずつ待って、要求時間分経過したかを確認するループをまわす。
usleeep
の挙動はこの動画も面白かった。