考虑这个例子-
class Test
@@store = ""
end这里的store是Test的一个类变量,可以在任何地方改变。
假设我在多线程模式下运行我的程序&所以变量存储可以一次从多个线程变化。
我的问题是-是否会出现死锁,或者crystal-lang会因为纤程调度而以某种方式处理它?
如果出现死锁,建议用什么方法来解决以上程序。如果你能提供这个问题的代码,那就更好了。
发布于 2020-04-12 15:22:19
不,死锁不会发生,因为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传递不可变数据,而不是在纤程之间共享可变数据。
https://stackoverflow.com/questions/61159220
复制相似问题