Actions
Bug #19407
closed
2 threads taking from current ractor will hang forever
Description
In the current implementation of Ractors, it's possible to take
from the current ractor. This could be useful
when co-ordinating threads:
t = Thread.new do
obj = Ractor.current.take
p obj # do some work with obj
end
t0 = Thread.new do
obj = Ractor.current.take
p obj # do some work with obj
end
Ractor.yield :go
However it hangs forever:
t = Thread.new do
obj = Ractor.current.take
p obj
end
t0 = Thread.new do
obj = Ractor.current.take
p obj
end
sleep 0.5
Should "self-take" be disabled, or was it designed to allow it but this is just a bug?
Updated by hsbt (Hiroshi SHIBATA) over 2 years ago
- Status changed from Open to Assigned
- Assignee set to ko1 (Koichi Sasada)
Updated by jhawthorn (John Hawthorn) 4 months ago
- Assignee changed from ko1 (Koichi Sasada) to ractor
Updated by jhawthorn (John Hawthorn) 2 days ago
- Status changed from Assigned to Closed
I believe the Ractor::Port interface doesn't suffer from this issue
ruby -e 'th = 2.times.map { |i| Thread.new { p(i => Ractor.receive) } }; %w[hello world].each { Ractor.current.send it }; th.each(&:join)'
{0 => "hello"}
{1 => "world"}
However I think it might make sense for us to forbid Ractor.current.join
/Ractor.current.value
❯ ruby -e 'Thread.current.join'
-e:1:in 'Thread#join': Target thread must not be current thread (ThreadError)
from -e:1:in '<main>'
❯ ruby -e 'Ractor.current.join'
(nothing, but exits cleanly with Ctrl-C)
Actions
Like0
Like0Like0Like0