ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

sleepの対象はスレッドかプロセスか?

2006-05-11 01:01:18 | PG(UNIX)

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()はすぐに終了する(書込み可能状態を返す)。

標準出力といえども、書込み専用ってわけじゃないんだねぇ…。


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ソケット通信(TCP/IP) | トップ | sleepの対象はスレッドでした... »
最新の画像もっと見る

コメントを投稿

PG(UNIX)」カテゴリの最新記事