[#17017] 標準添付案 — Kazuhiro NISHIYAMA <zn@...>

西山和広です。

21 messages 2002/05/08
[#17019] Re: 標準添付案 — "Akinori MUSHA" <knu@...> 2002/05/08

At Wed, 8 May 2002 19:50:17 +0900,

[#17021] Re: 標準添付案 — GOTO Kentaro <gotoken@...> 2002/05/08

At Wed, 8 May 2002 22:45:06 +0900,

[#17031] double acosh — WATANABE Hirofumi <eban@...>

わたなべです。

25 messages 2002/05/10
[#17032] Re: double acosh — nobu.nakada@... 2002/05/10

なかだです。

[#17033] Re: double acosh — WATANABE Hirofumi <eban@...> 2002/05/10

わたなべです。

[#17036] Re: double acosh — matz@... (Yukihiro Matsumoto) 2002/05/10

まつもと ゆきひろです

[#17039] Re: double acosh — WATANABE Hirofumi <eban@...> 2002/05/10

わたなべです。

[#17134] argv[0] — Tanaka Akira <akr@...17n.org>

ふと ruby インタプリタの C における argv[0] を知りたくなったんですが、

23 messages 2002/05/18
[#17139] Re: argv[0] — matz@... (Yukihiro Matsumoto) 2002/05/18

まつもと ゆきひろです

[#17144] Re: msvcrt — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

18 messages 2002/05/19

[#17179] コマンドラインオプションの順序制約 — Kazuhiro NISHIYAMA <zn@...>

西山和広です。

13 messages 2002/05/22
[#17181] Re: コマンドラインオプションの順序制約 — matz@... (Yukihiro Matsumoto) 2002/05/22

まつもと ゆきひろです

[#17228] Re: [ruby-list:35305] Re: ((1.2)..(3.4)).to_a — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

28 messages 2002/05/30

[ruby-dev:17223] race condition on Queue#pop?

From: Tanaka Akira <akr@...17n.org>
Date: 2002-05-30 01:15:11 UTC
List: ruby-dev #17223
なんとなく thread.rb を眺めていて、Queue#pop に race condition がある
のではないかという気がしてきました。

Queue#pop は

  def pop(non_block=false)
    Thread.critical = true
    begin
      loop do
       if @que.empty?
          if non_block
            raise ThreadError, "queue empty"
          end
          @waiting.push Thread.current
          Thread.stop
        else
          return @que.shift
        end
      end
    ensure
      Thread.critical = false
    end
  end

というコードで、あるスレッド A が pop を呼び出し、最初に @que が空だっ
た場合、いったん Thread.stop で止まるわけですが、(他のスレッド B が
Queue#push を呼び出した結果)再開した時には Thread.critical は false に
なっているはずです。

従って、ループの 2回り目で、@que.empty? の直後にスレッドのコンテキスト
スイッチが起こる可能性があるように思います。そのタイミングで他の (上記
の Queue#push を呼び出したものとは異なるスレッド C が) Queue#pop を呼
び出すと、@que が空になり、さらにスレッド A にコンテキストスイッチして
処理を続けると空の @que を shift することになり、nil が返り値になる気
がします。

残念ながら、この問題を発現させるテストスクリプトを作ることはできません
でしたが、このようなことがおきない保証はどこかにあるでしょうか?
もし、保証できないなら、次のようなパッチを当てるといいんじゃないかと思
います。

Index: lib/thread.rb
===================================================================
RCS file: /src/ruby/lib/thread.rb,v
retrieving revision 1.12
diff -u -r1.12 thread.rb
--- lib/thread.rb	2002/05/29 05:20:39	1.12
+++ lib/thread.rb	2002/05/30 01:02:19
@@ -182,6 +182,7 @@
 	  end
 	  @waiting.push Thread.current
 	  Thread.stop
+	  Thread.critical = true
 	else
 	  return @que.shift
 	end

ちなみに、return @que.shift の直前に sleep 1 unless Thread.critical と
いうコードを入れれば、問題を発現させることができました。
-- 
[田中 哲][たなか あきら][Tanaka Akira]
「ふえろ! わかめちゃん作戦です$(C⊇」(Little Worker, 桂遊生丸)

In This Thread

Prev Next