C言語(UNIX)でスレッドに一時的なwaitを入れようと思ってsleep()を使ったら、どうも思ったのと動きが違う。
マニュアルを一見すると、sleep()及びusleep()が一時的に停止させるのは、スレッドではなくてプロセスらしいように書かれている(実はスレッドだったが)。
JavaやC#(.NET)のsleep()は「スレッドが対象」とjavadocやMSDNに書いてある(Threadクラスのメソッドだし)。
VC++で実験したところ、Windows APIの::Sleep()もスレッドが対象のようだ。
とりあえずsleep()以外の方法を探したところ、UNIXではselect()でタイムアウト時間のみを指定することで スレッドのスリープ代わりに使えるようだ。
当初はselect()を使って「標準入力の出力待ちや標準出力の入力待ちをすれば 絶対タイムアウトするだろう」と思ったんだけど、試してみたら期待と違う動作だった。
struct timeval tv={ 秒, マイクロ秒 }; //待ち時間
int fd=0; //0:stdin, 1:stdout, 2:stderr
fd_set fds;
FD_ZERO(&fds);
FD_SET(fd, &fds);
int ret=select(fd+1,&fds,NULL,NULL,&tv); //読込待ち
//int ret=select(fd+1,NULL,&fds,NULL,&tv); //書込待ち
Solaris(SunOS5.9)では、標準入力も標準出力も標準エラーも全く同じ動作で、
読込待ち:標準入力から何も入れなければタイムアウトするが、何か入れるとselect()を終了する。
書込待ち:select()はすぐに終了する(書込み可能状態を返す)。
標準出力といえども、書込み専用ってわけじゃないんだねぇ…。