Class: Threads

Inherits:
Object
  • Object
show all
Defined in:
lib/threads.rb

Overview

Threads.

Author

Yegor Bugayenko (yegor256@gmail.com)

Copyright

Copyright © 2018-2023 Yegor Bugayenko

License

MIT

Instance Method Summary collapse

Constructor Details

#initialize(total = Concurrent.processor_count * 8, log: $stdout) ⇒ Threads

Returns a new instance of Threads.

[View source]

33
34
35
36
37
38
39
40
41
# File 'lib/threads.rb', line 33

def initialize(total = Concurrent.processor_count * 8, log: $stdout)
  raise "Total can't be nil" if total.nil?
  raise "Total can't be negative or zero: #{total}" unless total.positive?

  @total = total
  raise "Log can't be nil" if log.nil?

  @log = log
end

Instance Method Details

#assert(reps = @total) ⇒ Object

[View source]

43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/threads.rb', line 43

def assert(reps = @total)
  raise "Repetition counter #{reps} can't be smaller than #{@total}" if reps < @total

  done = Concurrent::AtomicFixnum.new
  rep = Concurrent::AtomicFixnum.new
  pool = Concurrent::FixedThreadPool.new(@total)
  latch = Concurrent::CountDownLatch.new(1)
  @total.times do |t|
    pool.post do
      Thread.current.name = "assert-thread-#{t}"
      latch.wait(10)
      loop do
        r = rep.increment
        break if r > reps

        begin
          yield(t, r - 1)
        rescue StandardError => e
          print(Backtrace.new(e))
          raise e
        end
      end
      done.increment
    end
  end
  latch.count_down
  pool.shutdown
  raise "Can't stop the pool" unless pool.wait_for_termination(30)
  return if done.value == @total

  raise "Only #{done.value} out of #{@total} threads completed successfully"
end