为什么我的代码在等待管道时永远不会到达终点?

时间:2016-06-27 13:54:32

标签: crystal-lang

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

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

1 个答案:

答案 0 :(得分:2)

我看到一个w_waiter.puts和两个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"

同样的结果。

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

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