Этот поток рубинового кода безопасен? - PullRequest
2 голосов
/ 28 мая 2010

Безопасен ли этот код? кажется таким, каким он должен быть, потому что @myvar никогда не будет назначен из нескольких потоков (при условии, что блок завершается через

Но нужно ли мне беспокоиться о ситуации, когда второй блок пытается прочитать @myvar во время записи?

require 'rubygems'
require 'eventmachine'

@myvar = Time.now.to_i

EventMachine.run do

  EventMachine.add_periodic_timer(1) do
    EventMachine.defer do
      @myvar = Time.now.to_i # some calculation and reassign
    end
  end

  EventMachine.add_periodic_timer(0.5) do
    puts @myvar
  end

end

Ответы [ 3 ]

11 голосов
/ 22 июня 2010

Ваш код использует EventMachine , который использует потоки только для ввода-вывода и выполняет всю обработку кода в одном потоке. EventMachine разработан именно для ваших целей, поэтому все переменные доступ безопасны для всех потоков, без дополнительных проверок в вашем коде.

Мало того, что присваивание безопасно (хотя и атомарно), но манипулирование структурами данных также безопасно и не зависит от условий гонки.

1 голос
/ 28 мая 2010

Но нужно ли мне беспокоиться о ситуации, когда второй блок пытается прочитать @myvar во время записи?

Нет, назначение в Ruby является атомарным.

1 голос
/ 28 мая 2010

Предполагая, что создание потока + оценка вашего блока кода происходит менее чем за 1 секунду каждый раз, да. Иначе нет, это не потокобезопасно.

Одна вещь, которую я думаю стоит упомянуть, это то, что, очевидно, ваш пример надуман; однако, в зависимости от вашего фактического кода, возможно, стоит проверить Revactor для ваших целей. Это структура актера, которая использует легкие, не выгружаемые потоки выполнения. В результате многие общие проблемы безопасности потоков выходят за пределы окна, поскольку одновременно не могут работать два актера.

Просто мысль.

...