9

TVarはどのように機能しますか?私が読んだところによると、すべてのトランザクションを受信するとすぐに実行しようとしますが、トランザクションが完了すると、現在実行中の他のトランザクションが無効になり、再起動する必要があります。これはTVarの仕組みですか?

この場合、100ミリ秒ごとに1ミリ秒の長さのトランザクションが発生する場合、処理に200ミリ秒かかるトランザクションは決して完了しないことを意味しますか?

4

2 に答える 2

10

2つのトランザクションが個別にアクセスする限り、TVars相互に無効にすることなく、両方を同時にコミットできます。

トランザクションいつ無効になるかを明確にするために、次のシナリオを考えてみましょう。

  1. トランザクションの開始時にt :: TVar Int初期化され0、経由で読み取られるとします。readTVar tA
  2. 一方、別のスレッドでは、aが実行されるトランザクションBが開始されます。writeTVar t 1の前にBコミットするとしAます。BSTMシステムは、不整合がないかどうかをチェックし、この時点でコミットしても安全であると結論付けます。これで、writeTVar t 1有効になります。
  3. ただし、これにより、の先頭での古い値が読み取られたため、トランザクションAが無効になります。(コミットが許可された場合、アトミック性の違反が発生します。)0tAA

HaskellのSTMシステムに関する元の論文[1](セクション6.5を参照)は、あなたの質問に答えます。

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

[1]ティム・ハリス、サイモン・マーロウ、サイモン・ペイトン・ジョーンズ、モーリス・ハーリヒー。並列プログラミングの原則と実践に関するACM会議2005(PPoPP'05)。

于 2012-04-10T16:57:29.810 に答える
4

100ミリ秒ごとに1ミリ秒の長さのトランザクションが発生した場合、処理に200ミリ秒かかるトランザクションは決して完了しないことを意味しますか?

トランザクションは、同じに接触した場合にのみ競合するTVarため、1ミリ秒のトランザクションの一部が200ミリ秒のトランザクションの影響を受けるすべての変数を回避した場合、200ミリ秒のトランザクションを完了できます。さらに、STMモナドは内部で許可されるものについて非常に厳密であるため(メモリアクセスと純粋な計算のみ!)、トランザクションの長さの間にこのような不一致があることは非常にまれです。通常、それらはほんの数メモリの読み取り/書き込みの長さであり、すべてのIOその他の計算はトランザクション外で行われます。さらに、特定のトランザクションが他のトランザクションによって永久にブロックされるかどうかは、スケジューリングの問題です。GHCの現在のスケジューラーがどのように見えるかは100%わかりませんが、古い(またはより高い失敗率)トランザクションを優先することはもっともらしいようです。

とは言うものの、livelockは、の非常に現実的な問題でありSTM、従来のロック同時実行の実装におけるデッドロックと同じくらい陰湿で、推論するのが困難です。

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

あなたはおそらくこの論文を楽しむでしょう:

  • Tim Harris、Simon Marlow、Simon Peyton-Jones、およびMaurice Herlihy、「コンポーザブルメモリトランザクション」、https ://doi.org/10.1145/1065944.1065952(プレプリントPDFはこちら
于 2012-04-10T16:59:53.623 に答える