首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在crystal-lang中多线程的静态变量上的突变是安全的吗?

在crystal-lang中多线程的静态变量上的突变是安全的吗?
EN

Stack Overflow用户
提问于 2020-04-11 23:26:19
回答 1查看 67关注 0票数 1

考虑这个例子-

代码语言:javascript
复制
class Test
   @@store = ""
end

这里的store是Test的一个类变量,可以在任何地方改变。

假设我在多线程模式下运行我的程序&所以变量存储可以一次从多个线程变化。

我的问题是-是否会出现死锁,或者crystal-lang会因为纤程调度而以某种方式处理它?

如果出现死锁,建议用什么方法来解决以上程序。如果你能提供这个问题的代码,那就更好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-12 15:22:19

不,死锁不会发生,因为Crystal不会对变量访问进行隐式锁定。但是用这样的全局状态编写线程不安全的代码是非常容易的。

糟糕的例子:

代码语言:javascript
复制
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传递不可变数据,而不是在纤程之间共享可变数据。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61159220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档