123456789_123456789_123456789_123456789_123456789_

Class: Concurrent::Semaphore

Relationships & Source Files
Inherits: Concurrent::SemaphoreImplementation
Defined in: lib/concurrent-ruby/concurrent/atomic/semaphore.rb

Overview

A counting semaphore. Conceptually, a semaphore maintains a set of permits. Each #acquire blocks if necessary until a permit is available, and then takes it. Each #release adds a permit, potentially releasing a blocking acquirer. However, no actual permit objects are used; the Semaphore just keeps a count of the number available and acts accordingly. Alternatively, permits may be acquired within a block, and automatically released after the block finishes executing.

Examples:

semaphore = Concurrent::Semaphore.new(2)

t1 = Thread.new do
  semaphore.acquire
  puts "Thread 1 acquired semaphore"
end

t2 = Thread.new do
  semaphore.acquire
  puts "Thread 2 acquired semaphore"
end

t3 = Thread.new do
  semaphore.acquire
  puts "Thread 3 acquired semaphore"
end

t4 = Thread.new do
  sleep(2)
  puts "Thread 4 releasing semaphore"
  semaphore.release
end

[t1, t2, t3, t4].each(&:join)

# prints:
# Thread 3 acquired semaphore
# Thread 2 acquired semaphore
# Thread 4 releasing semaphore
# Thread 1 acquired semaphore
semaphore = Concurrent::Semaphore.new(1)

puts semaphore.available_permits
semaphore.acquire do
  puts semaphore.available_permits
end
puts semaphore.available_permits

# prints:
# 1
# 0
# 1

Class Method Summary

  • .new(count) constructor

    Create a new Semaphore with the initial count.

Instance Method Summary

Constructor Details

.new(count)

Create a new Semaphore with the initial count.

Parameters:

  • count (Fixnum)

    the initial count

Raises:

  • (ArgumentError)

    if count is not an integer

[ GitHub ]

  
# File 'lib/concurrent-ruby/concurrent/atomic/semaphore.rb', line 161

class Semaphore < SemaphoreImplementation
end

Instance Method Details

#acquire(permits = 1) ⇒ nil, BasicObject

Acquires the given number of permits from this semaphore,

blocking until all are available. If a block is given,
yields to it and releases the permits afterwards.

is given, its return value is returned.

Parameters:

  • permits (Fixnum) (defaults to: 1)

    Number of permits to acquire

Returns:

  • (nil, BasicObject)

    Without a block, nil is returned. If a block

Raises:

  • (ArgumentError)

    if permits is not an integer or is less than zero

[ GitHub ]

  
# File 'lib/concurrent-ruby/concurrent/atomic/semaphore.rb', line 161

class Semaphore < SemaphoreImplementation
end

#available_permitsInteger

Returns the current number of permits available in this semaphore.

[ GitHub ]

  
# File 'lib/concurrent-ruby/concurrent/atomic/semaphore.rb', line 161

class Semaphore < SemaphoreImplementation
end

#drain_permitsInteger

Acquires and returns all permits that are immediately available.

[ GitHub ]

  
# File 'lib/concurrent-ruby/concurrent/atomic/semaphore.rb', line 161

class Semaphore < SemaphoreImplementation
end

#release(permits = 1) ⇒ nil

Releases the given number of permits, returning them to the semaphore.

Parameters:

  • permits (Fixnum) (defaults to: 1)

    Number of permits to return to the semaphore.

Raises:

  • (ArgumentError)

    if permits is not a number or is less than zero

[ GitHub ]

  
# File 'lib/concurrent-ruby/concurrent/atomic/semaphore.rb', line 161

class Semaphore < SemaphoreImplementation
end

#try_acquire(permits = 1, timeout = nil) ⇒ true, ...

Acquires the given number of permits from this semaphore,

only if all are available at the time of invocation or within
{timeout} interval. If a block is given, yields to it if the permits
were successfully acquired, and releases them afterward, returning the
block's return value.

Parameters:

  • permits (Fixnum) (defaults to: 1)

    the number of permits to acquire

  • timeout (Fixnum) (defaults to: nil)

    the number of seconds to wait for the counter or nil to return immediately

Returns:

  • (true, false, nil, BasicObject)

    false if no permits are available, true when acquired a permit. If a block is given, the block’s return value is returned if the permits were acquired; if not, nil is returned.

Raises:

  • (ArgumentError)

    if permits is not an integer or is less than zero

[ GitHub ]

  
# File 'lib/concurrent-ruby/concurrent/atomic/semaphore.rb', line 161

class Semaphore < SemaphoreImplementation
end