[#5218] Ruby Book Eng tl, ch1 question — Jon Babcock <jon@...>

13 messages 2000/10/02

[#5404] Object.foo, setters and so on — "Hal E. Fulton" <hal9000@...>

OK, here is what I think I know.

14 messages 2000/10/11

[#5425] Ruby Book Eng. tl, 9.8.11 -- seishitsu ? — Jon Babcock <jon@...>

18 messages 2000/10/11
[#5427] RE: Ruby Book Eng. tl, 9.8.11 -- seishitsu ? — OZAWA -Crouton- Sakuro <crouton@...> 2000/10/11

At Thu, 12 Oct 2000 03:49:46 +0900,

[#5429] Re: Ruby Book Eng. tl, 9.8.11 -- seishitsu ? — Jon Babcock <jon@...> 2000/10/11

Thanks for the input.

[#5432] Re: Ruby Book Eng. tl, 9.8.11 -- seishitsu ? — Yasushi Shoji <yashi@...> 2000/10/11

At Thu, 12 Oct 2000 04:53:41 +0900,

[#5516] Re: Some newbye question — ts <decoux@...>

>>>>> "D" == Davide Marchignoli <marchign@di.unipi.it> writes:

80 messages 2000/10/13
[#5531] Re: Some newbye question — matz@... (Yukihiro Matsumoto) 2000/10/14

Hi,

[#5544] Re: Some newbye question — Davide Marchignoli <marchign@...> 2000/10/15

On Sat, 14 Oct 2000, Yukihiro Matsumoto wrote:

[#5576] Re: local variables (nested, in-block, parameters, etc.) — Dave Thomas <Dave@...> 2000/10/16

matz@zetabits.com (Yukihiro Matsumoto) writes:

[#5617] Re: local variables (nested, in-block, parameters, etc.) — "Brian F. Feldman" <green@...> 2000/10/16

Dave Thomas <Dave@thomases.com> wrote:

[#5705] Dynamic languages, SWOT ? — Hugh Sasse Staff Elec Eng <hgs@...>

There has been discussion on this list/group from time to time about

16 messages 2000/10/20
[#5712] Re: Dynamic languages, SWOT ? — Charles Hixson <charleshixsn@...> 2000/10/20

Hugh Sasse Staff Elec Eng wrote:

[#5882] [RFC] Towards a new synchronisation primitive — hipster <hipster@...4all.nl>

Hello fellow rubyists,

21 messages 2000/10/26

[ruby-talk:5286] Re: Proper ConditionVariable usage?

From: Shugo Maeda <shugo@...>
Date: 2000-10-04 16:40:03 UTC
List: ruby-talk #5286
Hi,

At Wed, 4 Oct 2000 21:24:28 +0900,
kjana@os.xaxon.ne.jp (YANAGAWA Kazuhisa) wrote:
> > Apperently CV::wait should use mutex.synchronize instead of exclusive
> > unlock.
> 
> That's because ConditionVariable is NOT for general synchronization,
> but condition variables in a monitor like context.
> ConditionVariable#wait(mutex) means ``wait on a condition represented
> by ConditionVariable, releasing lock for other threads do their job in
> a critical region the waiting thread was held and the condition is
> met.

Here is a simple example.

class YAQueue
  def initialize
    @que = []
    @mutex = Mutex.new
    @empty_cond = ConditionVariable.new
  end

  def enq(obj)
    @mutex.synchronize do
      @que.push(obj)
      @empty_cond.signal
    end
  end

  def deq
    @mutex.synchronize do
      while @que.empty?
        @empty_cond.wait(@mutex)
      end
      return @que.shift
    end
  end
end

YAQueue implements a yet another Queue class using ConditionVariable.

You can wait multiple conditions for one mutex.

class YASizedQueue < YAQueue
  attr :max
  
  def initialize(max)
    @max = max
    @full_cond = ConditionVariable.new
    super()
  end

  def enq(obj)
    @mutex.synchronize do
      while @que.length >= @max
        @full_cond.wait(@mutex)
      end
      super(obj)
    end
  end

  def deq
    @mutex.synchronize do
      obj = super
      if @que.length < @max
        @full_cond.signal
      end
      return obj
    end
  end
  
  def max=(max)
    @mutex.synchronize do
      @max = max
      @full_cond.broadcast
    end
  end
end

Shugo


In This Thread