我有一个用Ruby编写的高度多线程应用程序,它共享一些实例变量。写入这些变量很少(1%),而读取非常常见(99%)。 最好的方法(在您看来或在惯用的Ruby方式中)是什么,以确保这些线程始终能够看到最新的值?到目前为止,我有一些想法(虽然在我改革之前我想要你的意见):
synchronize
块,我看不到一种简单的方法来避免它。freeze
方法(参见here),虽然它看起来同样麻烦,并没有给我任何第一个选项带来的同步好处。这些选项看起来都非常相似,但希望那里的任何人都会有更好的想法(或者可以为这些想法之一辩护)。我也可以使对象不可变,因此它们在操作过程中不会被破坏或改变,但我不太了解Ruby以便自己进行调用,this question似乎认为对象是高度可变的。
答案 0 :(得分:6)
使用锁是最合适的方法。你可以看到Jim Weirich关于这个主题的演讲:What All Rubyist Should Know About Threading。
此外,冻结对象对您没有帮助,因为您要修改这些变量。冻结它们意味着不会对这些进行进一步的修改(因此你的1%的写入将不起作用)。
答案 1 :(得分:1)
我自己没有使用它,但您可能想查看Dataflow。它使所有变量都写入一次。
答案 2 :(得分:0)
答案 3 :(得分:0)
您必须使用Mutex来同步对共享状态的访问。真的没有办法避免这样做。
在现代多核机器上,您不能对如何访问内存或内存访问如何与缓存进行交互做出任何假设。