相关疑难解决方法(0)

STM性能不佳/锁定

我正在编写一个程序,其中有大量代理监听事件并对它们做出反应.由于Control.Concurrent.Chan.dupChan被弃用,我决定使用TChan的广告.

TChan的表现比我预期的要糟糕得多.我有以下程序来说明问题:

{-# LANGUAGE BangPatterns #-}

module Main where

import Control.Concurrent.STM
import Control.Concurrent
import System.Random(randomRIO)
import Control.Monad(forever, when)

allCoords :: [(Int,Int)]
allCoords = [(x,y) | x <- [0..99], y <- [0..99]]

randomCoords :: IO (Int,Int)
randomCoords = do
  x <- randomRIO (0,99)
  y <- randomRIO (0,99)
  return (x,y)

main = do
  chan <- newTChanIO :: IO (TChan ((Int,Int),Int))

  let watcher p = do
         chan' <- atomically $ dupTChan chan
         forkIO $ forever $ do
                    r@(p',_counter) <- atomically $ …
Run Code Online (Sandbox Code Playgroud)

concurrency performance haskell stm

20
推荐指数
3
解决办法
3263
查看次数

STM monad问题

这只是一个假设情景来说明我的问题.假设它们之间共享两个线程和一个TVar.在一个线程中有一个原子块来读取TVar并需要10秒才能完成.在另一个线程中是一个原子块,每秒修改一次TVar.第一个原子块是否会完成?当然它会一直回到开头,因为日志永远处于不一致的状态?

monads concurrency haskell transactional-memory

13
推荐指数
2
解决办法
1204
查看次数