8

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

  • 在读取或写入任何这些变量之前拥有一个最常用的锁(来自Java Concurrency in Practice)。这样做的缺点是它synchronize在我的代码中放置了很多块,而且我没有看到一个简单的方法来避免它。
  • 使用 Ruby 的freeze方法(请参阅此处),尽管它看起来同样繁琐,并且没有给我任何第一个选项所提供的同步优势。

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

4

4 回答 4

6

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

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

于 2009-01-03T17:08:28.620 回答
1

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

于 2010-04-03T03:56:41.550 回答
0

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

读写锁

它有很多实现:

写锁模式

您不想为每次读/写加锁

于 2009-01-02T22:53:04.307 回答
0

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

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

于 2009-01-02T23:11:07.903 回答