对crystal-lang中来自多线程的静态变量进行突变是否安全?

问题描述 投票:0回答:1

考虑此示例-

class Test
   @@store = ""
end

这里存储是Test的类变量,可以在任何地方进行突变。

假设我正在多线程模式下运行我的程序,因此可以一次从多个线程中更改变量存储。

我的问题是-由于光纤调度,是否会出现死锁或crystal-lang处理该死锁?

如果出现死锁,建议使用什么方法解决上述程序。如果您可以提供解决此问题的代码,那会更好。

deadlock crystal-lang
1个回答
1
投票

不,因为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提供了一些同步原语,例如MutexAtomic,但是通常的建议是,与Channel相比,更喜欢传递不可变的数据,而不是在光纤之间共享可变的数据。

© www.soinside.com 2019 - 2024. All rights reserved.