Skip to content

struct Atomic(T)
inherits Struct

A value that may be updated atomically.

Only primitive integer types, reference types or nilable reference types can be used with an Atomic type.

Class methods

.new(value : T)

Creates an Atomic with the given initial value.

View source

Methods

#add(value : T)

Performs atomic_value += value. Returns the old value.

atomic = Atomic.new(1)
atomic.add(2) # => 1
atomic.get    # => 3
View source

#and(value : T)

Performs atomic_value &= value. Returns the old value.

atomic = Atomic.new(5)
atomic.and(3) # => 5
atomic.get    # => 1
View source

#compare_and_set(cmp : T, new : T) : Tuple(T, Bool)

Compares this atomic's value with cmp:

  • if they are equal, sets the value to new, and returns {old_value, true}
  • if they are not equal the value remains the same, and returns {old_value, false}
atomic = Atomic.new(1)

atomic.compare_and_set(2, 3) # => {1, false}
atomic.get                   # => 1

atomic.compare_and_set(1, 3) # => {1, true}
atomic.get                   # => 3
View source

#get

Atomically returns this atomic's value.

View source

#lazy_get

Non-atomically returns this atomic's value.

View source

#lazy_set(value : T)

Non-atomically sets this atomic's value to value. Returns the new value.

atomic = Atomic.new(5)
atomic.lazy_set(10) # => 10
atomic.get          # => 10
View source

#max(value : T)

Performs atomic_value = max(atomic_value, value). Returns the old value.

atomic = Atomic.new(5)

atomic.max(3) # => 5
atomic.get    # => 5

atomic.max(10) # => 5
atomic.get     # => 10
View source

#min(value : T)

Performs atomic_value = min(atomic_value, value). Returns the old value.

atomic = Atomic.new(5)

atomic.min(10) # => 5
atomic.get     # => 5

atomic.min(3) # => 5
atomic.get    # => 3
View source

#nand(value : T)

Performs atomic_value = ~(atomic_value & value). Returns the old value.

atomic = Atomic.new(5)
atomic.nand(3) # => 5
atomic.get     # => -2
View source

#or(value : T)

Performs atomic_value |= value. Returns the old value.

atomic = Atomic.new(5)
atomic.or(2) # => 5
atomic.get   # => 7
View source

#set(value : T)

Atomically sets this atomic's value to value. Returns the new value.

atomic = Atomic.new(5)
atomic.set(10) # => 10
atomic.get     # => 10
View source

#sub(value : T)

Performs atomic_value -= value. Returns the old value.

atomic = Atomic.new(9)
atomic.sub(2) # => 9
atomic.get    # => 7
View source

#swap(value : T)

Atomically sets this atomic's value to value. Returns the old value.

atomic = Atomic.new(5)
atomic.swap(10) # => 5
atomic.get      # => 10
View source

#xor(value : T)

Performs atomic_value ^= value. Returns the old value.

atomic = Atomic.new(5)
atomic.xor(3) # => 5
atomic.get    # => 6
View source