Нет, тупик не возникнет, поскольку 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, а не изменяемый обмен данными между волокнами.