2012-04-10 2 views
6

TVarはどのように機能しますか?私が読んだところでは、それを受け取った直後にすべてのトランザクションを実行しようとしますが、完了したトランザクションは現在実行中の他のトランザクションを無効にします。これはTVarの仕組みですか?ハスケル:TVarはどのように機能しますか?

この場合、100msごとに1msのトランザクションが発生した場合、処理に200msかかるトランザクションは完了しませんか?

答えて

8

2つのトランザクションが別々のTVarsにアクセスする限り、それらは互いに無効にすることなく同時にコミットできます。 t :: TVar Int0に初期化され、トランザクションAの初めにreadTVar tを介して読み出されることを想定

  1. :トランザクション無効化されたとき

    ちょうどそれを明確にするために、の次のシナリオを検討してみましょう。

  2. 一方、別のスレッドでは、トランザクションBが開始され、writeTVar t 1が実行されます。 BAの前にコミットすると仮定します。 STMシステムは、矛盾がないかどうかをチェックし、Bがこの時点でコミットすることが安全であると結論付けるので、writeTVar t 1が有効になります。
  3. ただし、これはAの最初にtの古い値0が読み取られたため、トランザクションAが無効になります。 (Aがコミットさせた場合、我々は、アトミックの違反になるだろう。)

オリジナルの紙は、[1] HaskellのSTMシステム上(秒6.5を参照)は、あなたの質問に答える:

「飢餓をたとえば、 で実行されるトランザクションは、非常に長いトランザクションと繰り返し競合する可能性があります。 実際には飢餓が起きる可能性は低いと考えていますが、 はそれ以上の経験なしにはわかりません。

[1] Tim Harris、Simon Marlow、Simon Peyton Jones、およびMaurice Herlihy。パラレルプログラミング2005の原則と実践に関するACM会議(PPoPP'05)

+0

[上記のものを含む、様々なSTM論文およびプレゼンテーションへのリンク](http://research.microsoft.com/en-us/um/people/simonpj/papers/stm/index.htm) – hammar

5

100msごとに1msのトランザクションが発生した場合、処理に200msかかるトランザクションは完了しませんか? 1msの取引の一部が200msの取引によって影響を受けるすべての変数を避けるので、もし彼らは、同じTVar Sに触れた場合

取引のみ葛藤、そして200msの一つが完了することができるだろう。さらに、STMモナドは内部で許可されているものについて非常に厳密であるため(メモリアクセスと純粋な計算です!)、トランザクションの長さの間にこのような不一致があるのは非常に珍しいことです。通常は、ほんのわずかのメモリ読み取り/書き込みになり、IOと他の計算はすべてトランザクション外で実行されます。さらに、他のトランザクションによって特定のトランザクションが永遠にブロックされるかどうかは、スケジューリング上の問題です。私はGHCの現在のスケジューラーがどのように見えるかを100%確信しているわけではありませんが、それは古い(またはより高い失敗率の)トランザクションに優先する可能性があります。

ライブロックは、STMで非常に実際的な問題であり、より伝統的なロックの並行処理の実装では、デッドロックと同じくらい狡猾で、難しいと言えます。

TVarはどのように機能しますか?

あなたはおそらくthis paperを楽しむでしょう。

関連する問題