精度の高いsleepの実装

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の挙動はこの動画も面白かった。