Project

General

Profile

Actions

Bug #19407

closed

2 threads taking from current ractor will hang forever

Added by luke-gru (Luke Gruber) over 2 years ago. Updated 2 days ago.

Status:
Closed
Assignee:
Target version:
-
[ruby-core:112206]

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)
Actions #2

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

Also available in: Atom PDF

Like0
Like0Like0Like0