8

いくつかのインスタンス変数を共有する、Ruby で記述された高度にマルチスレッド化されたアプリがあります。これらの変数への書き込みはまれ (1%) ですが、読み取りは非常に一般的 (99%) です。これらのスレッドが常に最新の値を参照できるようにする最善の方法 (あなたの意見または慣用的な Ruby の方法) は何ですか? これまでに私が持っていたいくつかのアイデアを次に示します (ただし、これをオーバーホールする前に、あなたの意見をお聞かせください)。

  • これらの変数の読み取りまたは書き込みの前に最もよく使用されるロックを用意します ( Java Concurrency in Practiceから)。これの欠点はsynchronize、コードに多くのブロックが配置され、それを回避する簡単な方法が見当たらないことです。
  • Ruby のfreeze方法 (こちらを参照) を使用しますが、これも同様に面倒に見え、最初のオプションが提供する同期の利点はまったく得られません。

これらのオプションはどちらも非常に似ているように見えますが、うまくいけば、そこにいる誰かがより良いアイデアを持っているでしょう (または、これらのアイデアのいずれかについてうまく議論できるでしょう)。また、操作の途中でオブジェクトが破損したり変更されたりしないように、オブジェクトを不変にしても問題ありませんが、自分で呼び出しを行うのに十分なほどRubyを知りません。この質問は、オブジェクトが非常に可変です。

4

4 に答える 4

6

これを行うには、ロックを使用するのが最も適切な方法です。Jim Weirich による次のテーマに関するプレゼンテーションを見ることができます: What All Rubyist Should Know About Threading

また、これらの変数を変更したいので、ここではオブジェクトをフリーズしても役に立ちません。それらをその場で凍結するということは、これらにそれ以上の変更を適用できないことを意味します (したがって、書き込みの 1% は機能しません)。

于 2009-01-03T17:08:28.620 に答える
1

私自身は使用していませんが、Dataflowを確認することをお勧めします。すべての変数を1回だけ書き込みます。

于 2010-04-03T03:56:41.550 に答える
0

共有状態へのアクセスを同期するには、Mutex を使用する必要があります。これを避ける方法は本当にありません。

最新のマルチコア マシンでは、メモリがどのようにアクセスされるか、またはメモリ アクセスがキャッシュとどのように相互作用するかについて、想定を立てることはできません。

于 2009-01-02T23:11:07.903 に答える
0

リーダー/ライター ロックは、適切に定義されたソリューションに伴う一般的な問題です。

リーダーライターロック

そして、それには多くの実装があります:

ロックパターンの書き込み

読み取り/書き込みごとにロックをかけたくない

于 2009-01-02T22:53:04.307 に答える