使用 MRI ruby 1.9 我有一些代码
def foo()
puts "in foo"
loop do
puts "in foo loop"
end
end
def bar()
puts "in bar"
start_alsa_listener
end
foo_thread = Thread.new { foo }
bar_thread = Thread.new { bar }
foo_thread.join
bar_thread.join
start_alsa_listener 是一个阻塞库调用,它打开 ALSA midi 音序器并等待其上的输入事件。本质上,我希望我的代码能够不断地“在 foo 循环中”打印出来,同时能够接收 ALSA midi 事件并将它们也打印到控制台(start_alsa_listener 在收到事件时会这样做)。
问题是,当我运行上面的代码时,一旦 bar() 运行,它就永远不会将上下文切换回 foo()。
start_alsa_listener 是一个 ruby C 扩展,看起来像:
for(;;) {
poll(/* args */); /* wait for input data */
/* print data to console */
}
也许它与 Ruby 中的某些事情有关,我在线程方面做错了,或者可能与轮询有关,或者可能与 ALSA 处理线程的方式有关。任何帮助表示赞赏。