1

我是 Haskell 和 STM 的新手,我正在尝试理解基本概念。

一般来说,在 Haskell 和函数式编程中,如果我错了,请纠正我,没有赋值之类的东西。

我不能写x=3;我所能做的就是用xand生成另一个绑定3

现在谈到 TVar 和线程,如果我有多个线程共享同一个 TVar,如果一个线程更改值,使用writeTVar,其他线程将看到更改的值,对吗?

所以如果我有 2 个线程共享同一个TVar Intvar,第一个线程加 1,如果成功,第二个线程会看到更新的值吗?

塔克斯

4

2 回答 2

3

是的,TVar就是容器,当它的内容改变时它不会改变。所有线程都看到同一个容器,当一个线程更改容器中存储的内容时,当另一个线程查看时,它会找到更改后的值。

于 2013-01-05T14:52:26.947 回答
3

最好不要考虑TVar变量,而是可以读取和写入的通道。

纯变量可以被认为是一个纯函数,它总是返回一些值(并且这个值只绑定一次,就像在你的例子中一样)。monad 中的变量/函数有一些“上下文”(这就是 monads 的用途),这可能会改变它的值(例如randomIO :: Random a => IO afromSystem.Random可能被认为是“monadic value”,值,可以在任何调用时改变)。

读取和写入TVar是不纯的显式操作,这就是为什么函数 readTVar/writeTVar被包装到STMmonad 中的原因,它们依赖于一些隐藏的上下文,这可能会改变结果(使线程之间的值传输成为可能)。但是,这将这些操作限制在STMmonad 中,只能转义IO

于 2013-01-05T15:35:18.760 回答