我有一个用 Ruby 编写的高度多线程应用程序,它共享一些实例变量。对这些变量的写入很少见 (1%),而读取则非常常见 (99%)。 确保这些线程始终看到所涉及的最新值的最佳方法是什么(无论是您认为的还是惯用的 Ruby 方式)? 到目前为止,我有一些想法(尽管在彻底修改之前我希望得到您的意见):

  • 在读取或写入任何这些变量(来自 Java 并发实践)。这样做的缺点是它会花费很多 synchronize 我的代码中存在块,但我没有找到避免它的简单方法。
  • 使用 Ruby 的 freeze 方法(参见 这里),尽管它看起来同样麻烦,并且没有给我带来第一个选项所带来的任何同步好处。

这些选项看起来都非常相似,但希望任何人都会有更好的想法(或者可以很好地支持其中一个想法)。我也可以让对象不可变,这样它们就不会在操作过程中被损坏或改变,但我对 Ruby 的了解还不够深,无法自己进行调用, 这个问题 似乎认为对象是高度可变的。

有帮助吗?

解决方案

使用锁是最合适的方法。您可以查看 Jim Weirich 就该主题所做的演讲: 所有 Rubyist 都应该了解的关于线程的知识.

此外,冻结对象在这里不会有帮助,因为您想要修改这些变量。将它们冻结到位意味着 没有进一步的修改将适用于这些 (因此你的 1% 的写入将不起作用)。

其他提示

我自己没用过,但你可能想看看 数据流. 。它使所有变量一次性写入。

读写锁是一个常见问题,有一个明确的解决方案:

读写锁

它有很多实现:

写入锁定图案

您不想为每个读/写加锁

您必须使用互斥体来同步对共享状态的访问。确实没有办法避免这样做。

在现代多核计算机上,您无法对如何访问内存或内存访问如何与缓存交互做出任何假设。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top