为什么我的代码在等待管道时从来没有到达终点



我正在尝试使用IO。管道在进程之间发送消息,但是当我在等待完成消息时,我遇到了某种饥饿。

代码:https://carc.in//r/12 ly

我看到一个w_waiter.puts和2倍的r_waiter.gets,这就是它阻塞的原因。如果我在第一个之后再加一个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"

相同的结果。

我不确定为两个分叉进程使用相同的管道是否有效。您应该为每个进程创建一个管道。

或者(我不知道您的程序是什么),您可以使用衍生和通道,如并发指南中所述:http://crystal-lang.org/docs/guides/concurrency.html

相关内容

  • 没有找到相关文章

最新更新