2013-01-05 26 views
1

我是Haskell和STM的新手,我試圖理解基本概念。Haskell STM分片TVAR

在Haskell和函數式編程中,如果我錯了,請糾正我,沒有像賦值這樣的事情。

我不能寫x=3;我所能做的就是生成與x3的其他綁定。

現在談到TVar和線程時,如果我有多個線程共享相同的TVar,如果一個線程更改了值,使用writeTVar,其他線程會看到更改的值,對嗎?

所以如果我有2個線程共享相同的TVar Int var,並且第一個給它加1,如果成功,第二個線程會看到更新後的值?

Thaks

回答

3

TVar不是一個變量,而是一個可以讀取和寫入的通道可能更好。

一個純變量可以被認爲是一個純函數,它總是返回一些值(並且這個值只被綁定一次,就像在你的例子中一樣)。一個monad中的變量/函數有一些「上下文」(這是單子的用途),可能會改變它的值(例如randomIO :: Random a => IO aSystem.Random可能被認爲是「monadic value」值,可以在任何調用時更改) 。

讀取和寫入TVar是不是純粹的明確的操作,這就是爲什麼功能readTVar/writeTVar被包裝成STM單子,它們依賴於一些隱藏的背景下,這可能會改變結果(進行價值傳遞線程之間可能的)。儘管如此,這些操作限制爲STM monad,但只能轉移到IO

+0

謝謝,說明了很多:) – user1544128

3

是的,TVar是容器,並不時其內容的變化而變化。所有線程都看到相同的容器,並且當一個線程更改存儲在容器中的內容時,當另一個線程看起來時,它會查找更改後的值。

+0

好的,感謝您的確認,它開始時看起來有點奇怪。 – user1544128

+0

只是一個額外的問題,如果我可能: 當我用'forkIO'創建一個線程時,由於返回的值是'IOThread',得到線程計算結果的唯一方法就是讓線程寫入一個'TVar'和它的「主」讀數? – user1544128

+2

它不一定是'TVar',你也可以使用'TChan','Chan','MVar','IORef'等等。但是這個原則的確如此,如果你想與'forkIO'd線程交流,你需要某種通信變量。 –