2016-06-27 3 views

答えて

2

私はなぜそれがブロックそれはだ、1 w_waiter.putsと2回を参照してください。最初のものの後に別のw_waiter.putsを追加すると、それは終了します。それは問題ですか?

編集:私はまた、Rubyの

r_producer, w_producer = IO.pipe 
r_waiter, w_waiter = IO.pipe 

2.times do |i| 
    fork do 
    puts "in fork #{i}" 
    loop do 
     message = r_producer.gets.chomp 
     sleep 0.1 
     puts "#{message} from #{i}" 
     break if message == "0" 
    end 
    puts "sending finish" 
    w_waiter.puts "finish" 
    end 
end 

10.times do |i| 
    w_producer.puts i + 1 
end 

2.times do 
    w_producer.puts 0 
end 

2.times { r_waiter.gets } 
puts "end of the program" 

同じ結果でこれを試してみました。

2つのフォークされたプロセスで同じパイプを使用しているかどうかはわかりません。プロセスごとに1つのパイプを作成する必要があります。また

同時実行ガイドで説明したように、あなたは、卵とチャンネルを使用することができます(私はあなたのプログラムが何であるかを知らない):http://crystal-lang.org/docs/guides/concurrency.html

+0

しかし、2のプロセスが実行されている、それらの両方がときw_waiter.putsを呼び出す必要がありますループが終了すると、1つが立ち往生し、メッセージ「送信終了」が1回だけ表示されます。 –

+0

私はRubyでこれを試しましたが、同じ結果が得られます: – asterite

+0

Rubyコードと簡単な説明/推測で答えを編集しました – asterite

関連する問題