2012-12-05 8 views
5

は、のような方法:私はMyClass.perform()を呼び出す複数のスレッドがある場合Rubyクラスのメソッドはスレッドセーフですか?例えば

class MyClass 
    self.perform(id) 
    hash = doSomething(id) 
    doMoreStuff(hash) 
    return hash 
    end 
end 

私の懸念があります。オブジェクトhashは別のスレッドによって上書きされる可能性がありますか?つまり、スレッド1はdoSomethingを呼び出して、{1 => 1}のハッシュを返します。しかし直後にスレッド2はdoSomethingを呼び出し、{2 => 2}というハッシュを取得します。今、何が起きた?スレッド1のハッシュは{2 => 2}に変更されますか?

または、各スレッドは他のスレッドに決して触れることができない独自のhashで動作しますか? doSomethingdoMoreStuffがすでにスレッドセーフであると仮定します。

重要な場合は、Rails 3.0を使用しています。

+0

私が知っている限り、例えば、レールではありません。 – macool

+0

このメソッドについてスレッドセーフに関する懸案事項を説明できますか? –

+1

また、メソッドの最後に 'return'の必要はありません。最後の行に 'hash'があれば、それが戻り値になります。 –

答えて

16

hashなどのローカル変数は、周囲のメソッドの特定の呼び出しに対してローカルです。 2つのスレッドが同時にを呼び出すと、呼び出しごとに独自の実行コンテキストが生成され、インスタンス変数(@hash)、クラス変数(@@hash)、グローバル($hash)などの共有リソースが含まれていない限り、 、...は並行性の問題を引き起こす可能性があります。あなたのperformのような単純なものでスレッドに悩まされることは何もありません。

performがスレッドを作成していて、perform内のクロージャで終わってしまった場合、クロージャでキャプチャされた同じローカル変数を参照するいくつかのスレッドが終了する可能性があります。したがって、スレッドを作成するときにスコープの問題に注意する必要がありますが、ローカル変数でしか動作しない単純なメソッドを扱う際には心配する必要はありません。

1

「クラスメソッド」(クラスオブジェクトの単なるシングルトンメソッド)なのは、インスタンスメソッドではなく、スレッドセーフではありません。

+1

@Downvoter答えが書かれたとき、質問は本当に曖昧で、私はこれ以上の情報を提供することができませんでした。私はまだOPが何を求めているかを明確にしようとしているので、この回答をdownvoteしないでください。 –

関連する問題