1
IO.pipeを使用してプロセス間でメッセージを送信しようとしていますが、終了メッセージを待っているときに何らかの飢餓状態に陥ります。パイプを待っているときにコードが終了しないのはなぜですか?
IO.pipeを使用してプロセス間でメッセージを送信しようとしていますが、終了メッセージを待っているときに何らかの飢餓状態に陥ります。パイプを待っているときにコードが終了しないのはなぜですか?
私はなぜそれがブロックそれはだ、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
しかし、2のプロセスが実行されている、それらの両方がときw_waiter.putsを呼び出す必要がありますループが終了すると、1つが立ち往生し、メッセージ「送信終了」が1回だけ表示されます。 –
私はRubyでこれを試しましたが、同じ結果が得られます: – asterite
Rubyコードと簡単な説明/推測で答えを編集しました – asterite