Bartosz Milewski の STM に関するすばらしいブログ投稿を読んで、次の記事を読んで興奮しました。
ただし、重要な事実を考慮してください。STM は非常にきめ細かいものです。たとえば、アイテムをツリーに挿入する場合、STM トランザクションは、実際に変更しているノードのみをロックします。STM は、ツリー全体に 1 つのグローバル ロックを使用するソリューションよりも簡単に勝てます。
しかし、私が理解しているように、この動作は自動ではありませんよね? を使用するTVar (Map k a)
と、マップ全体で単一のグローバル ロックとして機能しませんか? そして、このきめの細かい動作の利点を得るには、私 (または誰か) が、内部にTMap
含まれるマップの置換 (たとえば、 )を実装する必要がありますね。TVars
これは明らかな質問のように思えるかもしれませんが、STM の実装について調べていると、TVar
s の読み取りとメモリ位置の読み取りを混同していました。私はそれが正しいことを確認したいだけです!
Bartosz 氏はさらに次のように述べています。
デッドロックのリスクがあるため、ノードごとの手動ロックを正しく実装するのは困難です。
私が理解しているように、STM との違いは、実際の STM 実装では手動でロックされたソリューションと同じようにロックを使用する一方で、実際のロックの取得と解放はプログラマーではなくランタイムによって処理されるということです。正しいですか?