到目前爲止,我已經爲我的項目做了一些代碼,但不知道它是真是假。你們能看到我的代碼嗎?首先,我應該提出更好的理解要求。這個TLA +規範是否正確?
在計算機科學中,互斥是指確保兩個進程或線程同時處於關鍵部分的要求。關鍵部分是指進程訪問共享資源(例如共享內存)的時間段。互斥問題最早由Edsger W. Dijkstra在1965年的題爲「解決併發編程控制問題的文章」中找到並解決。
有關問題的直觀描述,請參見圖。在鏈表中,通過改變前一節點的「下一個」指針指向後續節點來完成節點的移除(例如,如果移除節點i,則節點i-1的「下一個」指針將是改爲指向節點i + 1)。在多個進程之間共享這樣的鏈表的執行中,兩個進程可能試圖同時移除兩個不同的節點,導致以下問題:讓節點i和i + 1成爲要移除的節點;此外,既不是頭部也不是尾巴;節點i-1的下一個指針將改變爲指向節點i + 1,並且節點i的下一個指針將改變爲指向節點i + 2。儘管兩個刪除操作都成功完成,但是由於i-1指向i + 1跳過節點i(這是通過將下一個指針設置爲i來反映刪除i + 1的節點),節點i + 1仍然保留在列表中I + 2)。使用互斥可以避免此問題,以確保不會同時更新列表的同一部分。
這是我的代碼:
EXTENDS Naturals
CONSTANT Unlocked, Locked
VARIABLE P1,P2
TypeInvariant == /\ P1 \in {Unlocked,Locked}
/\ P2 \in {Unlocked,Locked}
Init == /\ TypeInvariant
/\ P1 = Unlocked
Remove1 == P2' = Locked
Remove2 == P1' = Locked
Next == Remove1 \/ Remove2
Spec == Init /\ [][Next]_<<P1,P2>>
THEOREM Spec => []TypeInvariant
你想實現什麼?互斥體如何與刪除鏈表中的元素相關?我認爲你可以改善這個問題。順便說一句,你有沒有試過閱讀Lamport的並行系統原理和規範第7章:http://research.microsoft.com/en-us/um/people/lamport/tla/hyperbook.html – marcmagransdeabril