stm

    9热度

    1回答

    为什么Contol.Concurent.STM函数库中的check函数的类型为Bool -> STM a并且成功返回undefined而不是类型Bool -> STM()有充分的理由吗?事情是这样实现的类型检查器政体编译DO块与check foo结束只有在运行时用*** Exception: Prelude.undefined失败。

    5热度

    1回答

    这是一个理想的问题,因为我希望更好地理解Clojure的并发性。 假设我在写boids。假设每个boid都是一个单独的绿色线程,在向量中变换位置或代表世界网格。想想Hickey的蚂蚁殖民地。 现在,Clojure.org上的文档声明:“所有参考文献的内容都将从交易的起点(其”读取点“)看到'参考世界'的一致快照。” 这是否意味着我只能得到我的模拟的一致快照,例如绘制,通过读取事务中我裁判的载体(即

    5热度

    1回答

    什么时候应该选择Akka TransactionalMap超过与SynchronizedMap混合的常规不可变映射,反之亦然? (或者我在这里比较苹果和橘子?)

    1热度

    1回答

    在捕捉源Snap.Internal.Http.Server.TimeoutManager ------------------------------------------------------------------------------ -- | Register a new connection with the TimeoutManager. register :: IO()

    0热度

    1回答

    这是来自我的Traveller项目的子问题。 我已经放在一起处理输入的粗鲁的代码。它的工作原理,直到我引入TChan的混合。以下是工作代码,并举例说明如何使用它。然后,我会改变它并解释我为什么这样做。然后,我会谈论这个问题。 {-# LANGUAGE ScopedTypeVariables #-} import Control.Monad (forever) import Control.Co

    3热度

    1回答

    简而言之,我正在寻找一种编辑开源编译器或优化器的方法,以将传统的锁实现更改为软件跨国内存事务。我有三种目标语言,C,C++和Java。一个想法可能是使用GCC,因为它现在有stm支持。问题是,我想不出一种方法来实现对由GCJ转储的java字节码的这些更改。同样的问题出现在llvm上。 tldr;试图找到像gcc或llvm这样的编译器或优化器,我可以轻松地将其转换为源代码或源代码的中间表示形式。

    10热度

    1回答

    我已经注意到这个成语在Data.Unique: uniqSource :: TVar Integer uniqSource = unsafePerformIO (newTVarIO 0) {-# NOINLINE uniqSource #-} 是它保证只运行一次?

    5热度

    1回答

    为了熟悉哈斯克尔STM,我写了下面的解决哲学家就餐问题: import Control.Concurrent import Control.Concurrent.STM import Control.Monad import System.Random type Fork = TVar Bool type StringBuffer = TChan String philosophe

    2热度

    1回答

    我有一个游戏服务器,为每个客户端forkIO生成一个线程。例如,我想分享一份客户名单和所有这些名单的怪物名单。 我的第一个想法是拥有一个包含两个列表的数据类型的TVar容器,但假设两个线程同时更改客户端和怪物,如果我理解该部分是正确的,那么会回滚其中的一个。这将是不必要的回滚。 第二个想法是让列表TVars,然后只是将它们作为参数传递,但我宁愿让它们放在容器中,以便在添加更多列表时保持代码清洁和轻

    5热度

    1回答

    我想要使the "official" example of clojure concurrency更接近使用手动锁定的java版本。 In this gist我把Java和clojure代码和所有版本的VisualVm配置文件的线程转储。 这是Clojure的代码和时序 (ns simple-example (:gen-class)) (set! *warn-on-reflection* tru