Ruby – 不可变对象

我有一个用Ruby编写的高度multithreading的应用程序,它共享一些实例变量。 写入这些变量很少(1%),而读取非常常见(99%)。 什么是最好的方式(在您看来或以惯用的Ruby方式)确保这些线程始终能够看到最新的值? 到目前为止,我有一些想法(尽管在我检修之前我想要你的意见):

  • 在读取或写入任何这些变量之前,请使用最常用的锁(来自Java Concurrency in Practice )。 这样做的缺点是它在我的代码中放了很多synchronize块,我没有看到一种简单的方法来避免它。
  • 使用Ruby的freeze方法(见这里 ),虽然它看起来同样麻烦,并没有给我任何第一个选项带来的同步好处。

这些选项看起来都非常相似,但希望那里的任何人都会有更好的想法(或者可以为其中一个想法辩护)。 我也可以将对象变为不可变,因此它们在操作过程中不会被破坏或改变,但是我不太了解Ruby以便自己调用这个问题似乎在争论对象是高度可变的。

使用锁是最合适的方法。 你可以看到Jim Weirich关于这个主题的演讲: 所有Rubyist应该知道的关于线程的内容 。

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

我自己没有使用它,但您可能想查看Dataflow 。 它使所有变量都写入一次。

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

读者 – 作家锁

它有很多实现:

写锁模式

您不希望为每次读/写锁定

您必须使用Mutex来同步对共享状态的访问。 真的没有办法避免这样做。

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