From: matz@... (Yukihiro Matsumoto) Date: 1997-05-07T19:02:37+09:00 Subject: [ruby-list:2911] Re: thread and fork まつもと ゆきひろです. In message "[ruby-list:2910] thread and fork" on 97/05/07, Jun Kuroda writes: |黒田です。 | |ruby - version 1.0-970425 (i686-linux) 上で添付するプログラ |ムの実行結果が以下のようになります。 | thread の時 l.24 の sleep で眠ったままになってます。 linuxでは,子processのmain_threadが | while f.alive?||t.alive? | end の部分で全力疾走してしまうようです.とりあえず | while f.alive?||t.alive? | Thread.pass | end にすると期待しているであろう動作になります. どうも linux はforkすると子processにitimerの設定が引き継がれ ないようです.とりあえずこのメールに添付したパッチを当てると Thread.passを追加する必要はありません. forkとthreadを組み合わせるとそれぞれのプロセスでthreadが動く ことになるので,難しいですね. --- process.c~ Wed Apr 23 10:36:02 1997 +++ process.c Wed May 7 18:57:59 1997 @@ -218,8 +218,8 @@ { struct itimerval tval; - tval.it_interval.tv_sec = 1; - tval.it_interval.tv_usec = 0; + tval.it_interval.tv_sec = 0; + tval.it_interval.tv_usec = 100000; tval.it_value = tval.it_interval; setitimer(ITIMER_VIRTUAL, &tval, NULL); } @@ -326,6 +326,9 @@ rb_secure(2); switch (pid = fork()) { case 0: +#ifdef linux + after_exec(); +#endif if (iterator_p()) { rb_yield(Qnil); _exit(0);