Ruby MRI中的Thread Safe实例变量

时间:2014-06-06 05:57:48

标签: ruby multithreading

我已经搜索过其他Stack Overflow帖子并在其他地方进行过研究,而且我对广泛的线程很熟悉,我只需要对这个具体案例进行一些澄清,因为本机ruby线程并非如此。我曾经习惯于jruby中的并行线程,并且我不像操作OS级别的线程那样完全理解绿色线程。

鉴于标准:

  • 我需要在类实例中触发邮件程序。
  • 邮件程序需要访问存储在实例属性中的数据。
  • 我不关心线程是否成功。
  • 我不希望线程成功或失败中断我的主线程。

哪个更好?

我应该直接引用原始实例变量,还是应该修复该实例变量?

这有效,但我担心@foo可能会在线程完成之前丢失:

@foo = { bar: "baz" }
Thread.new { Mailer.notice(@foo).deliver }

想知道我是否应该做这样的事情:

@foo = { bar: "baz" }
Thread.new { Mailer.notice(@foo.freeze.clone).deliver }

响应

以引用的例子或文章的形式将不胜感激。如果有人有时间写这样的例子,真正的测试会更有价值!

1 个答案:

答案 0 :(得分:0)

答案是。由于我使用的是> 1.9,因此线程不是绿色的,从生命周期的角度来看,这两种方法都是相同的。