簡體   English   中英

嵌套在orElse中的STM事務中的驗證

[英]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所述的整個頂級交易被重試並最終阻塞的情況下,當ab任何a被喚醒時, A是否被喚醒是正確的嗎? ,或c變化?

最后,作為獎勵 ,做上述變化事務的語義,如果我們(或庫的作者)改變orElseinfixr

我認為“嵌套”是不恰當的描述方式。 這是三個備用交易; 沒有一個嵌套在另一個內部。 特別是,這三種情況中的一種恰好會發生並被落實-但是發生的哪一種並不確定。 這句話足以回答所有三個問題,但是請確保為每個問題仔細說一遍:

  1. 沒有保證。 也許takeTMVar b將完成並提交; 否則它將被搶占,而takeTMVar a將被喚醒並完成。 但是他們不會全部完成,這是肯定的。

  2. 是的,這是正確的:所有三個TMVar都可以喚醒該線程。

  3. 語義不會改變:只要其中幾個可以提交,最左邊的一個就會提交。 (特別是描述STM的論文說,“ orElse函數遵循有用的定律:它是關聯的,並且具有單元retry 。”。)

  4. (摘自您提出的問題)鏈接的論文第8頁STM的語義確實保證了最成功的事務成功的事務。 所以:如果線程A正在執行takeTMVar b (但尚未提交)和線程B執行,並承諾一個寫a ,並沒有什么事情發生后 ,你可以肯定的是線程A將重新啟動,並返回來自新寫入的值a “此后什么也沒有發生”部分很重要:語義對發生的事情作出了承諾,但對實現的實現方式不做承諾。 所以,如果說,另一個線程從拿了a立即(以便takeTMvar a仍然在不斷retry ),足夠聰明的實現是允許注意到這一點,而不是重新啟動線程A從交易的開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM