[英]Validation in STM transactions nested with orElse
該評論頁面描述了GHC中STM
的許多詳細信息,但我想在幾點上保持清晰。
首先 ,當父級中訪問的變量發生更改時,嵌套事務是否無效?
例如我們在線程A
:
takeTMVar a `orElse` takeTMVar b `orElse` takeTMVar c
假設當A
執行嵌套事務takeTMVar b
,另一個線程B
執行putTMVar a ()
; 線程A
可以成功完成其嵌套事務,還是使其無效(這會使我感到錯誤)?
我想理解的第二點是,但我不介意放心:在上述針對A
所述的整個頂級交易被重試並最終阻塞的情況下,當a
, b
任何a
被喚醒時, A
是否被喚醒是正確的嗎? ,或c
變化?
最后,作為獎勵 ,做上述變化事務的語義,如果我們(或庫的作者)改變orElse
給infixr
?
我認為“嵌套”是不恰當的描述方式。 這是三個備用交易; 沒有一個嵌套在另一個內部。 特別是,這三種情況中的一種恰好會發生並被落實-但是發生的哪一種並不確定。 這句話足以回答所有三個問題,但是請確保為每個問題仔細說一遍:
沒有保證。 也許takeTMVar b
將完成並提交; 否則它將被搶占,而takeTMVar a
將被喚醒並完成。 但是他們不會全部完成,這是肯定的。
是的,這是正確的:所有三個TMVar
都可以喚醒該線程。
語義不會改變:只要其中幾個可以提交,最左邊的一個就會提交。 (特別是描述STM的論文說,“ orElse
函數遵循有用的定律:它是關聯的,並且具有單元retry
。”。)
(摘自您提出的問題)鏈接的論文第8頁STM的語義確實保證了最成功的事務是成功的事務。 所以:如果線程A
正在執行takeTMVar b
(但尚未提交)和線程B
執行,並承諾一個寫a
,並沒有什么事情發生后 ,你可以肯定的是線程A
將重新啟動,並返回來自新寫入的值a
。 “此后什么也沒有發生”部分很重要:語義對發生的事情作出了承諾,但對實現的實現方式不做承諾。 所以,如果說,另一個線程從拿了a
立即(以便takeTMvar a
仍然在不斷retry
),足夠聰明的實現是允許注意到這一點,而不是重新啟動線程A
從交易的開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.