63得票6回答
有使用软件事务内存的实际经验吗?

似乎近来对STM(软件事务内存)框架和语言扩展产生了越来越高的兴趣。特别是Clojure,它有一个出色的实现,使用MVCC(多版本并发控制)而不是滚动提交日志。GHC Haskell也有非常优雅的STM单子,也允许事务组合。最后,稍微炫耀一下,我最近为Scala实现了一个STM框架,可以静态地...

61得票1回答
一个处理通道,2个相同类型的IO源

在我的 GHC Haskell 应用程序中,我使用 stm、network-conduit 和 conduit,为每个套接字都创建了一个分支线程,这是通过 runTCPServer 自动完成的。不同的分支线程可以通过广播 TChan 进行通信。 下面是我想要设置 conduit “链”的示例...

46得票2回答
TVar和TMVar的区别

我见过 TVar 是一个简单的容器,而 TMVar 与 MVar 相同,意味着它有一个锁等,在 STM monad 内部。我在想为什么需要这样做,因为 STM 的想法是使锁变得不必要。 那么如果你有一个类型像 [Handle],一个 socket handle 列表,想要在 forkIO 创...

42得票2回答
何时/为什么使用MVar而不是TVar

尽管MVar看起来更加简单,但我觉得TVar更容易使用,而且TVar的功能更加丰富。 所以我的问题很简单,什么情况下我需要使用MVar而非TVar?我想任何时候只要不需要事务更新,就可以使用MVar,但是这样有什么好处呢?

39得票1回答
无死锁或资源饥饿的并发通用数据结构

我最近问了一些关于TVar的问题,但我仍然担心活锁。 所以我想到了这种结构: 每个事务都获得一个唯一的优先级(可能按创建顺序分配)。 事务尝试获取它们访问的数据的读/写锁。自然地,同时进行的读取是可以的,但一个写锁排除所有其他锁(包括读和写)。 假设事务A的优先级高于事务B。如果A持有锁...

31得票3回答
Clojure STM和Haskell STM有什么不同之处?

我试图找出Clojure所称的STM与Haskell中实现的STM之间的区别。撇开实际语言语义的差异,我有点困惑,因为Rich Hickey在他的演讲中说Clojure的STM实现与其他任何东西都非常不同,但我除了语言选择以外不理解这些差异。

28得票5回答
你如何实现软件事务内存?

在实际的低级原子指令和内存屏障(我假设它们被使用)方面,你如何实现STM? 对于我来说神秘的部分是,在给定任意一段代码后,您需要一种方法在之后返回并确定每个步骤中使用的值是否有效。您是如何做到这一点的,而且如何高效地做到这一点?这还表明,就像任何其他“锁定”解决方案一样,您希望尽可能减小关键...

27得票2回答
Haskell快速并发队列

问题 大家好!我正在编写一个日志库,希望创建一个在单独线程运行的记录器,而所有应用程序线程只需向其发送消息。我想找到这个问题的最佳性能解决方案。 我需要一个简单的无限队列。 方法 我创建了一些测试来查看可用解决方案的表现,但结果非常奇怪。 我测试了四种实现(以下提供源代码): pip...

21得票3回答
性能不佳/STM死锁问题

我正在编写一个程序,其中大量代理监听事件并对其做出反应。由于Control.Concurrent.Chan.dupChan已被弃用,因此我决定像宣传的那样使用TChan。 TChan的性能比我预期的要差得多。我有以下程序可以说明问题:{-# LANGUAGE BangPatterns #-}...

17得票4回答
我该如何让Clojure STM程序持久化?

我正在编写一个使用STM的Clojure程序。目前,我正在从数据库中启动populating STM(使用refs),然后在每次dosync事务成功时异步更新数据库。但是,我不知道这样做是否正确,或者是否有更好的标准技术来完成这项任务。有人可以解释一下如何将STM的ACI属性转换为Clojur...