I'm testing Concurrent::Semaphore,
require 'concurrent'
loop do
semaphore = Concurrent::Semaphore.new(3)
(1..5).each_with_object([]) do |_n, result|
result << Thread.new do
semaphore.acquire
print '.'
semaphore.release
end
end.each(&:join)
end
but the code yields exception like below in several seconds to run.
./semaphore.rb:14:in `join': No live threads left. Deadlock? (fatal)
2 threads, 2 sleeps current:0x00007f867c9a73a0 main thread:0x00007f867a503350
* #<Thread:0x00007f867a869c20 sleep_forever>
rb_thread_t:0x00007f867a503350 native:0x00007fffa9b16380 int:0
./semaphore.rb:14:in `join'
./semaphore.rb:14:in `each'
./semaphore.rb:14:in `block in <main>'
./semaphore.rb:3:in `loop'
./semaphore.rb:3:in `<main>'
* #<Thread:0x00007f867b8891f0@./semaphore.rb:7 sleep_forever>
rb_thread_t:0x00007f867c9a73a0 native:0x000070000c9b8000 int:0
depended by: tb_thread_id:0x00007f867a503350
./semaphore.rb:10:in `write'
./semaphore.rb:10:in `print'
./semaphore.rb:10:in `block (3 levels) in <main>'
Is something wrong of the usage?
(with MRI ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17])