2

このコードはスレッドセーフですか?@myvarが複数のスレッドから割り当てられることは決してないため(ブロックが1秒未満で完了すると想定)、そうあるべきであるように思われます。

しかし、2番目のブロックが書き込まれているときに@myvarを読み取ろうとしている状況について心配する必要がありますか?

require 'rubygems'
require 'eventmachine'

@myvar = Time.now.to_i

EventMachine.run do

  EventMachine.add_periodic_timer(1) do
    EventMachine.defer do
      @myvar = Time.now.to_i # some calculation and reassign
    end
  end

  EventMachine.add_periodic_timer(0.5) do
    puts @myvar
  end

end
4

3 に答える 3

11

コードはEventMachineを使用しています。これは、IO専用のスレッドを使用し、すべてのコード処理を単一のスレッドで実行します。EventMachineは目的に合わせて設計されているため、すべての変数アクセスは設計上スレッドセーフであり、コードに追加のチェックは必要ありません。

割り当てが安全であるだけでなく(アトミックであっても)、データ構造の操作も安全であり、競合状態の影響を受けません。

于 2010-06-21T22:42:47.147 に答える
1

スレッドの作成とコードブロックの評価が毎回1秒未満で行われると仮定すると、そうです。それ以外の場合は、スレッドセーフではありません。

言及する価値があると思うことの1つは、明らかにあなたの例が考案されているということです。ただし、実際のコードによっては、目的に応じてRevactorをチェックする価値がある場合があります。これはアクターフレームワークであり、軽量でプリエンプションのない実行スレッドを使用します。その結果、2つのアクターを同時に実行することはできないため、一般的なスレッドセーフの問題の多くはウィンドウの外に出ます。

ちょっとした考え。

于 2010-05-28T03:19:45.847 に答える
1

しかし、2番目のブロックが書き込まれているときに@myvarを読み取ろうとしている状況について心配する必要がありますか?

いいえ、Rubyでの割り当てはアトミックです。

于 2010-05-28T06:39:45.840 に答える