[ruby-list:2911] Re: thread and fork

From: matz@... (Yukihiro Matsumoto)
Date: 1997-05-07 10:02:37 UTC
List: ruby-list #2911
まつもと ゆきひろです.

In message "[ruby-list:2910] thread and fork"
    on 97/05/07, Jun Kuroda <jkuro@dwe.co.jp> 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);

In This Thread