我是haskell和stm的新手,我想做一个简单的rwlock。首先,我创建了需要 2 个 TVar 整数的 4 个主要函数(wlock、wunlock、rlock、runlock):读取线程数和写入线程数。
在这一点上,我无法按预期使用它。我尝试像这样编译
v1 <- atomically(newTVar 0);
v2 <- atomically(newTVar 0);
wlock v1 v2 -- wlock :: TVar Integer -> TVar Integer -> IO ()
这当然是丑陋的,但它有效(不知道为什么,因为原子返回IO (TVar a)
而不是TVar a
)
我想要的是:
我试图通过隐藏这些值来使它变得更好。我在某处读到单子可能是要走的路,但我还没有研究过它们。相反,我尝试将新类型 Rwlock 设为
data Rwlock = Rwlock { readCant :: TVar Integer
,writeCant :: TVar Integer
}
和一个构造函数,所以我可以做这样的事情:
import Rwlock
do{
a = rwconst;
forkIO(reader a);
forkIO(writer a);
}
读者将在哪里打电话rlock a
和作家wlock a
。
问题:
我无法制作构造函数。这是我尝试的(忽略maxLectores
)
(一个):
rwconst :: Integer -> Rwlock
rwconst n = Rwlock {readCant = TVar 0, writeCant = TVar 0, maxLectores = n}
{-rwconst n = Rwlock {readCant = atomically(newTVar 0), writeCant = atomically(newTVar 0), maxLectores = n}-}
但是没有导出 TVar 构造函数,并且没有任何内容返回 TVar。我不知道为什么当我这样做时第一个代码块有效wlock v1 v2
,但这样就不行了。
和(B):
rwconst :: Integer -> Rwlock
rwconst n = do
a <- (atomically(newTVar 0));
Rwlock {readCant = a, writeCant = a, maxLectores = n}
这里Rwlock没有问题,但是do语句返回IO(),而不是我想要的Rwlock,我找不到怎么做:(
任何人都可以告诉我这样做的方法吗?提前致谢。