TVarはどのように機能しますか?私が読んだところでは、それを受け取った直後にすべてのトランザクションを実行しようとしますが、完了したトランザクションは現在実行中の他のトランザクションを無効にします。これはTVarの仕組みですか?ハスケル:TVarはどのように機能しますか?
この場合、100msごとに1msのトランザクションが発生した場合、処理に200msかかるトランザクションは完了しませんか?
TVarはどのように機能しますか?私が読んだところでは、それを受け取った直後にすべてのトランザクションを実行しようとしますが、完了したトランザクションは現在実行中の他のトランザクションを無効にします。これはTVarの仕組みですか?ハスケル:TVarはどのように機能しますか?
この場合、100msごとに1msのトランザクションが発生した場合、処理に200msかかるトランザクションは完了しませんか?
2つのトランザクションが別々のTVars
にアクセスする限り、それらは互いに無効にすることなく同時にコミットできます。 t :: TVar Int
が0
に初期化され、トランザクションA
の初めにreadTVar t
を介して読み出されることを想定
ちょうどそれを明確にするために、の次のシナリオを検討してみましょう。
B
が開始され、writeTVar t 1
が実行されます。 B
がA
の前にコミットすると仮定します。 STMシステムは、矛盾がないかどうかをチェックし、B
がこの時点でコミットすることが安全であると結論付けるので、writeTVar t 1
が有効になります。A
の最初にt
の古い値0
が読み取られたため、トランザクションA
が無効になります。 (A
がコミットさせた場合、我々は、アトミックの違反になるだろう。)オリジナルの紙は、[1] HaskellのSTMシステム上(秒6.5を参照)は、あなたの質問に答える:
「飢餓をたとえば、 で実行されるトランザクションは、非常に長いトランザクションと繰り返し競合する可能性があります。 実際には飢餓が起きる可能性は低いと考えていますが、 はそれ以上の経験なしにはわかりません。
[1] Tim Harris、Simon Marlow、Simon Peyton Jones、およびMaurice Herlihy。パラレルプログラミング2005の原則と実践に関するACM会議(PPoPP'05)
100msごとに1msのトランザクションが発生した場合、処理に200msかかるトランザクションは完了しませんか? 1msの取引の一部が200msの取引によって影響を受けるすべての変数を避けるので、もし彼らは、同じ
TVar
Sに触れた場合
取引のみ葛藤、そして200msの一つが完了することができるだろう。さらに、STM
モナドは内部で許可されているものについて非常に厳密であるため(メモリアクセスと純粋な計算です!)、トランザクションの長さの間にこのような不一致があるのは非常に珍しいことです。通常は、ほんのわずかのメモリ読み取り/書き込みになり、IO
と他の計算はすべてトランザクション外で実行されます。さらに、他のトランザクションによって特定のトランザクションが永遠にブロックされるかどうかは、スケジューリング上の問題です。私はGHCの現在のスケジューラーがどのように見えるかを100%確信しているわけではありませんが、それは古い(またはより高い失敗率の)トランザクションに優先する可能性があります。
ライブロックは、STM
で非常に実際的な問題であり、より伝統的なロックの並行処理の実装では、デッドロックと同じくらい狡猾で、難しいと言えます。
TVarはどのように機能しますか?
あなたはおそらくthis paperを楽しむでしょう。
[上記のものを含む、様々なSTM論文およびプレゼンテーションへのリンク](http://research.microsoft.com/en-us/um/people/simonpj/papers/stm/index.htm) – hammar