[英]Difference between TVar and TMVar
我已經看到TVar
是一個簡單的容器,而TMVar
與MVar
相同,意味着它有鎖等,但在STM
monad中。 我想知道為什么這是必要的,因為STM
的想法是不需要鎖。
如果你有一個像[Handle]
這樣的類型,你想在forkIO
制作的線程之間使用套接字句柄的列表,那么哪個是使用的?
這不是鎖定的問題,而是關於引用意味着什么:
TVar
是STM
的可變引用,代表一般共享狀態。 你創建它持有一個值,你可以讀取和寫入它等。它非常類似於IORef
或STRef
(無論如何都是相同的)。
TMVar
是對線程可用於通信的插槽的引用。 它可以創建一個值,也可以為空。 你可以在其中放入一個值,如果已經填充了塊,直到有人將其清空; 或者你可以從中獲取一個值,如果已經是空塊,直到有人填充它。 它顯然類似於MVar
,但對於許多常見用途而言,將其視為用於通信生產者/消費者對的單元素隊列可能更簡單。
簡而言之, TVar
是一般共享狀態,如果您希望從任意位置對數據進行原子更新,請使用它。 TMVar
是一個同步原語,如果你想讓一個線程等到某個東西可用,而另一個等待需要的東西,則使用它。
還要注意TChan
,它大致實現為鏈接列表中的兩個TVar
持有位置,其中每個前向鏈路也是TVar
,並且用作通信的無界隊列。
當然,所有這些都可以以稍微不同的方式使用 - 你可以在不刪除它的情況下查看TMVar
的值,例如,如果你想要一個場景,其中多個線程都等待單個資源變得可用但它是永遠不會“用完”。
TVar
和TMVar
之間的差異並不像它們看起來那么大 - 絕對不能與IORef
和MVar
之間的差異IORef
。
雖然MVar
確實為線程安全提供了一些鎖定,但TMVar
並沒有什么有趣的! (沒有額外的鎖定)所有重要的東西都已經用STM
和TVar
實現了,所以TMVar a
只是TVar (Maybe a)
一個簡寫,配備了一些不錯的功能(其中一些使用retry
功能阻止)。
是否阻止retry
符合STM
的精神,是否它消除了STM的一些優點(沒有死鎖等)是一個單獨的問題,我希望看到有更有經驗的人來回答它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.