diff --git a/ChangeLog b/ChangeLog index 4820275b03..411a0689a6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Tue Jun 7 18:39:31 2005 Yukihiro Matsumoto + + * lib/thread.rb: RDoc documentation from Eric Hodel + added. [ruby-core:05148] + Tue Jun 7 18:30:04 2005 Nobuyoshi Nakada * lib/mkmf.rb (create_makefile): add .SUFFIXES from depend file. diff --git a/lib/thread.rb b/lib/thread.rb index a069c4680a..42611b7fce 100644 --- a/lib/thread.rb +++ b/lib/thread.rb @@ -23,7 +23,8 @@ end class Thread # - # FIXME: not documented in Pickaxe or Nutshell. + # Wraps a block in Thread.critical, restoring the original value upon exit + # from the critical section. # def Thread.exclusive _old = Thread.critical @@ -37,7 +38,7 @@ class Thread end # -# +Mutex+ implements a simple semaphore that can be used to coordinate access to +# Mutex implements a simple semaphore that can be used to coordinate access to # shared data from multiple concurrent threads. # # Example: @@ -58,6 +59,9 @@ end # } # class Mutex + # + # Creates a new Mutex + # def initialize @waiting = [] @locked = false; @@ -126,7 +130,7 @@ class Mutex # # Obtains a lock, runs the block, and releases the lock when the block - # completes. See the example under +Mutex+. + # completes. See the example under Mutex. # def synchronize lock @@ -138,7 +142,8 @@ class Mutex end # - # FIXME: not documented in Pickaxe/Nutshell. + # If the mutex is locked, unlocks the mutex, wakes one waiting thread, and + # yields in a critical section. # def exclusive_unlock return unless @locked @@ -157,9 +162,9 @@ class Mutex end # -# +ConditionVariable+ objects augment class +Mutex+. Using condition variables, +# ConditionVariable objects augment class Mutex. Using condition variables, # it is possible to suspend while in the middle of a critical section until a -# resource becomes available (see the discussion on page 117). +# resource becomes available. # # Example: # @@ -184,6 +189,9 @@ end # } # class ConditionVariable + # + # Creates a new ConditionVariable + # def initialize @waiters = [] end @@ -233,10 +241,31 @@ class ConditionVariable end # -# This class provides a way to communicate data between threads. +# This class provides a way to synchronize communication between threads. # -# TODO: an example (code or English) would really help here. How do you set up -# a queue between two threads? +# Example: +# +# require 'thread' +# +# queue = Queue.new +# +# producer = Thread.new do +# 5.times do |i| +# sleep rand(i) # simulate expense +# queue << i +# puts "#{i} produced" +# end +# end +# +# consumer = Thread.new do +# 5.times do |i| +# value = queue.pop +# sleep rand(i/2) # simulate expense +# puts "consumed #{value}" +# end +# end +# +# consumer.join # class Queue # @@ -269,7 +298,15 @@ class Queue rescue ThreadError end end + + # + # Alias of push + # alias << push + + # + # Alias of push + # alias enq push # @@ -287,7 +324,15 @@ class Queue ensure Thread.critical = false end + + # + # Alias of pop + # alias shift pop + + # + # Alias of pop + # alias deq pop # @@ -314,9 +359,7 @@ class Queue # # Alias of length. # - def size - length - end + alias size length # # Returns the number of threads waiting on the queue. @@ -327,9 +370,11 @@ class Queue end # -# This class represents queues of specified size capacity. The +push+ operation +# This class represents queues of specified size capacity. The push operation # may be blocked if the capacity is full. # +# See Queue for an example of how a SizedQueue works. +# class SizedQueue= @max @@ -382,9 +431,20 @@ class SizedQueue