【问题标题】:TVar constructor? I can't get a TVarTVar 构造函数?我无法获得 TVar
【发布时间】:2017-07-09 22:43:40
【问题描述】:

我是 haskell 和 stm 的新手,我想做一个简单的 rwlock。首先,我创建了需要 2 个 TVar Integeres 的 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

(A):

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,我找不到怎么做:(

谁能告诉我怎么做?提前致谢。

【问题讨论】:

标签: haskell stm tvar


【解决方案1】:

分配锁需要做 IO,你无法绕过它。所以在你的行动类型中承认它:

rwconst :: Integer -> IO Rwlock
rwcost n = do
    rcount <- newTVarIO 0
    wcount <- newTVarIO 0
    return Rwlock { readCant = rcount, writeCant = wcount, maxLectores = n }

然后,在main,你可以这样写:

main = do
    a <- rwconst 10
    forkIO (reader a)
    forkIO (writer a)
    -- and you should do something to wait for reader and writer to finish

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多