Безопасна ли мутация для переменной stati c из нескольких потоков в crystal-lang? - PullRequest
1 голос
/ 11 апреля 2020

Рассмотрим этот пример -

class Test
   @@store = ""
end

Здесь store является переменной класса Test и может быть видоизменено из любого места.

Предположим, я запускаю свою программу в многопоточном режиме & поэтому хранилище переменных может быть видоизменено из нескольких потоков одновременно.

Мой вопрос: возникнет ли тупик или Crystal-Lang каким-то образом справится с ним из-за планирования оптоволокна?

Если возникает тупик, каков рекомендуемый способ решения вышеуказанной программы. Если вы можете предоставить код из этой проблемы, это было бы лучше.

1 Ответ

3 голосов
/ 12 апреля 2020

Нет, тупик не возникнет, поскольку Crystal не выполняет неявную блокировку доступа к переменным. Но очень просто написать небезопасный код с глобальным состоянием, подобным этому.

ПЛОХОЙ ПРИМЕР:

module Test
  @@store = "a"

  def self.run
    spawn do
      @@store = @@store == "a" ? "b" : "c"
    end

    @@store = @@store == "b" ? "d" : "e"
  end
end

Test.run

При запуске этой программы с многопоточностью @@store может быть "b", "c", "d" или "e" в конце программы (на практике вы увидите очень редко все результаты, кроме одного, потому что не так уж много происходит и не так много споров, поэтому он будет достаточно стабильным в пределах среда выполнения).

Crystal предоставляет некоторые примитивы синхронизации, такие как Mutex и Atomic, но общая рекомендация состоит в том, чтобы предпочитать передачу неизменяемых данных через Channel s, а не изменяемый обмен данными между волокнами.

...