129 lines
2.4 KiB
Ruby
129 lines
2.4 KiB
Ruby
|
#
|
|||
|
# thwait.rb -
|
|||
|
# $Release Version: $
|
|||
|
# $Revision: 1.1 $
|
|||
|
# $Date: 1997/08/18 03:13:14 $
|
|||
|
# by Keiju ISHITSUKA(Nippon Rational Inc.)
|
|||
|
#
|
|||
|
# --
|
|||
|
#
|
|||
|
#
|
|||
|
#
|
|||
|
|
|||
|
require "thread.rb"
|
|||
|
require "e2mmap.rb"
|
|||
|
|
|||
|
class ThreadsWait
|
|||
|
RCS_ID='-$Header: /home/keiju/var/src/var.lib/ruby/RCS/thwait.rb,v 1.1 1997/08/18 03:13:14 keiju Exp keiju $-'
|
|||
|
|
|||
|
Exception2MessageMapper.extend_to(binding)
|
|||
|
def_exception("ErrWaitThreadsNothing", "Wait threads nothing.")
|
|||
|
def_exception("FinshedThreadsNothing", "finished thread nothing.")
|
|||
|
|
|||
|
# class mthods
|
|||
|
# all_waits
|
|||
|
|
|||
|
#
|
|||
|
# <20><><EFBFBD>ꤷ<EFBFBD><EAA4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>åɤ<C3A5><C9A4><EFBFBD><EFBFBD>ƽ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ޤ<EFBFBD><DEA4>Ԥ<EFBFBD>. <20><><EFBFBD>ƥ졼<C6A5><ECA1BC><EFBFBD>Ȥ<EFBFBD><C8A4>ƸƤФ<C6A4><D0A4><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
# <20><><EFBFBD>ꤷ<EFBFBD><EAA4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>åɤ<C3A5><C9A4><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5>ƥ졼<C6A5><ECA1BC><EFBFBD><EFBFBD><EFBFBD>ƤӽФ<D3BD>.
|
|||
|
#
|
|||
|
def ThreadsWait.all_waits(*threads)
|
|||
|
tw = ThreadsWait.new(th1, th2, th3, th4, th5)
|
|||
|
if iterator?
|
|||
|
tw.all_waits do
|
|||
|
|th|
|
|||
|
yield th
|
|||
|
end
|
|||
|
else
|
|||
|
tw.all_waits
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
# initialize and terminating:
|
|||
|
# initialize
|
|||
|
|
|||
|
#
|
|||
|
# <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20>Ԥĥ<D4A4><C4A5><EFBFBD><EFBFBD>åɤλ<C9A4><CEBB>꤬<EFBFBD>Ǥ<EFBFBD><C7A4><EFBFBD>.
|
|||
|
#
|
|||
|
def initialize(*threads)
|
|||
|
@threads = []
|
|||
|
@wait_queue = Queue.new
|
|||
|
join_nowait(*threads) unless threads.empty?
|
|||
|
end
|
|||
|
|
|||
|
# accessing
|
|||
|
# threads
|
|||
|
|
|||
|
# <20>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>åɤΰ<C9A4><CEB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD>.
|
|||
|
attr :threads
|
|||
|
|
|||
|
# testing
|
|||
|
# empty?
|
|||
|
# finished?
|
|||
|
#
|
|||
|
|
|||
|
#
|
|||
|
# <20>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>åɤ<C3A5>¸<EFBFBD>ߤ<EFBFBD><DFA4>뤫<EFBFBD>ɤ<EFBFBD><C9A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD>.
|
|||
|
def empty?
|
|||
|
@threads.empty?
|
|||
|
end
|
|||
|
|
|||
|
#
|
|||
|
# <20><><EFBFBD>Ǥ˽<C7A4>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>åɤ<C3A5><C9A4><EFBFBD><EFBFBD>뤫<EFBFBD>ɤ<EFBFBD><C9A4><EFBFBD><EFBFBD>֤<EFBFBD>
|
|||
|
def finished?
|
|||
|
!@wait_queue.empty?
|
|||
|
end
|
|||
|
|
|||
|
# main process:
|
|||
|
# join
|
|||
|
# join_nowait
|
|||
|
# next_wait
|
|||
|
# all_wait
|
|||
|
|
|||
|
#
|
|||
|
# <20>ԤäƤ<C3A4><C6A4>륹<EFBFBD><EBA5B9><EFBFBD>åɤ<C3A5><C9A4>ɲä<C9B2><C3A4>Ԥ<EFBFBD><D4A4>ˤϤ<CBA4><CFA4><EFBFBD>.
|
|||
|
#
|
|||
|
def join(*threads)
|
|||
|
join_nowait(*threads)
|
|||
|
next_wait
|
|||
|
end
|
|||
|
|
|||
|
#
|
|||
|
# <20>ԤäƤ<C3A4><C6A4>륹<EFBFBD><EBA5B9><EFBFBD>åɤ<C3A5><C9A4>ɲä<C9B2><C3A4><EFBFBD>. <20>Ԥ<EFBFBD><D4A4>ˤ<EFBFBD><CBA4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʤ<EFBFBD>.
|
|||
|
#
|
|||
|
def join_nowait(*threads)
|
|||
|
@threads.concat threads
|
|||
|
for th in threads
|
|||
|
Thread.start do
|
|||
|
th = Thread.join(th)
|
|||
|
@wait_queue.push th
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
#
|
|||
|
# <20><><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4>ˤϤ<CBA4><CFA4><EFBFBD>.
|
|||
|
# <20>ԤĤ٤<C4A4><D9A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>åɤ<C3A5><C9A4>ʤ<EFBFBD><CAA4><EFBFBD><EFBFBD><EFBFBD>, <20>㳰ErrWaitThreadsNothing <20><><EFBFBD>֤<EFBFBD>.
|
|||
|
# nonnlock<63><6B><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ˤ<EFBFBD>, nonblocking<6E><67>Ĵ<EFBFBD>٤<EFBFBD>. ¸<>ߤ<EFBFBD><DFA4>ʤ<EFBFBD><CAA4><EFBFBD><EFBFBD><EFBFBD>, <20>㳰
|
|||
|
# FinishedThreadNothing<6E><67><EFBFBD>֤<EFBFBD>.
|
|||
|
#
|
|||
|
def next_wait(nonblock = nil)
|
|||
|
Threads.Wait.fail ErrWaitThreadsNothing if @threads.empty?
|
|||
|
|
|||
|
th = @wait_queue.pop(nonblock)
|
|||
|
@threads.delete th
|
|||
|
th
|
|||
|
end
|
|||
|
|
|||
|
#
|
|||
|
# <20><><EFBFBD>ƤΥ<C6A4><CEA5><EFBFBD><EFBFBD>åɤ<C3A5><C9A4><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ޤ<EFBFBD><DEA4>Ԥ<EFBFBD>. <20><><EFBFBD>ƥ졼<C6A5><ECA1BC><EFBFBD>Ȥ<EFBFBD><C8A4>ƸƤФ줿<D0A4><ECA4BF><EFBFBD><EFBFBD>, <20><>
|
|||
|
# <20><><EFBFBD>åɤ<C3A5><C9A4><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>٤<EFBFBD>, <20><><EFBFBD>ƥ졼<C6A5><ECA1BC><EFBFBD><EFBFBD><EFBFBD>ƤӽФ<D3BD>.
|
|||
|
#
|
|||
|
def all_waits
|
|||
|
until @threads.empty?
|
|||
|
th = next_wait
|
|||
|
yield th if iterator?
|
|||
|
end
|
|||
|
end
|
|||
|
end
|