Pregunta 1
examinar la fuente de resonancia magnética 1.8.7 reveló ninguna manera obvia para iniciar un hilo en el estado de la "parado".
Lo que puedes hacer es tener el bloque de hilos en un mutex bloqueado, luego desbloquea el mutex cuando quieras que el hilo vaya.
#!/usr/bin/ruby1.8
go = Mutex.new
go.lock
t = Thread.new do
puts "Thread waiting to go"
go.lock
puts "Thread going"
end
puts "Telling the thread to go"
go.unlock
puts "Waiting for the thread to complete"
t.join
# => Thread waiting to go
# => Telling the thread to go
# => Thread going
# => Waiting for the thread to complete
Pregunta 2 (tipo de)
Did usted sabe que puede pasar argumentos a su hilo? Cualquier cosa pasó a Thread.new se pasa a través de bloques como argumentos:
#!/usr/bin/ruby1.8
t = Thread.new(1, 2, 3) do |a, b, c|
puts "Thread arguments: #{[a, b, c].inspect}"
# => Thread arguments: [1, 2, 3]
end
También hay "variables locales hilo," una tienda de clave/valor para cada subproceso. Use Thread#[]=
para establecer valores, y Thread#[]
para recuperarlos. Puede usar cadenas o símbolos como claves.
#!/usr/bin/ruby1.8
go = Mutex.new
go.lock
t = Thread.new(1, 2, 3) do |a, b, c|
go.lock
p Thread.current[:foo] # => "Foo!"
end
t[:foo] = "Foo!"
go.unlock
t.join
Pregunta 2, realmente
Usted puede hacer lo que quiere hacer. Es mucho trabajo, especialmente cuando la forma habitual de manejar los hilos es muy simple. Vas a tener que sopesar los pros y los contras:
#!/usr/bin/ruby1.8
require 'forwardable'
class MyThread
extend Forwardable
def_delegator :@thread, :join
def_delegator :@thread, :[]=
def_delegator :@thread, :[]
def initialize
@go = Mutex.new
@go.lock
@thread = Thread.new do
@go.lock
@stufftodo.call
end
end
def run(&block)
@stufftodo = block
@go.unlock
@thread.join
end
end
t = MyThread.new
t[:foo] = "Foo!"
t.run do
puts Thread.current[:foo]
end
t.join
# => "Foo!"
por qué no puedes "sólo" reemplazar '' x.start' con x = Thread.new {etc} '? –