簡體   English   中英

TVar和TMVar之間的區別

[英]Difference between TVar and TMVar

我已經看到TVar是一個簡單的容器,而TMVarMVar相同,意味着它有鎖等,但在STM monad中。 我想知道為什么這是必要的,因為STM的想法是不需要鎖。

如果你有一個像[Handle]這樣的類型,你想在forkIO制作的線程之間使用套接字句柄的列表,那么哪個是使用的?

這不是鎖定的問題,而是關於引用意味着什么:

  • TVarSTM的可變引用,代表一般共享狀態。 你創建它持有一個值,你可以讀取和寫入它等。它非常類似於IORefSTRef (無論如何都是相同的)。

  • TMVar是對線程可用於通信的插槽的引用。 它可以創建一個值,也可以為空。 你可以在其中放入一個值,如果已經填充了塊,直到有人將其清空; 或者你可以從中獲取一個值,如果已經是空塊,直到有人填充它。 它顯然類似於MVar ,但對於許多常見用途而言,將其視為用於通信生產者/消費者對的單元素隊列可能更簡單。

簡而言之, TVar是一般共享狀態,如果您希望從任意位置對數據進行原子更新,請使用它。 TMVar是一個同步原語,如果你想讓一個線程等到某個東西可用,而另一個等待需要的東西,則使用它。

還要注意TChan ,它大致實現為鏈接列表中的兩個TVar持有位置,其中每個前向鏈路也是TVar ,並且用作通信的無界隊列。

當然,所有這些都可以以稍微不同的方式使用 - 你可以在不刪除它的情況下查看TMVar的值,例如,如果你想要一個場景,其中多個線程都等待單個資源變得可用但它是永遠不會“用完”。

TVarTMVar之間的差異並不像它們看起來那么大 - 絕對不能與IORefMVar之間的差異IORef

雖然MVar確實為線程安全提供了一些鎖定,但TMVar並沒有什么有趣的! (沒有額外的鎖定)所有重要的東西都已經用STMTVar實現了,所以TMVar a只是TVar (Maybe a)一個簡寫,配備了一些不錯的功能(其中一些使用retry功能阻止)。

是否阻止retry符合STM的精神,是否它消除了STM的一些優點(沒有死鎖等)是一個單獨的問題,我希望看到有更有經驗的人來回答它。

暫無
暫無

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

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