【发布时间】:2015-01-02 11:28:14
【问题描述】:
当多个线程在等待写入 MVar 时,它们会以先进先出的方式执行。我想按照最短的作业调度执行线程。
我已经厌倦了使用 MVar 进行编码。这里的工作是计算一个斐波那契数并写一个 MVar。第一个线程计算斐波那契 30,第二个线程计算斐波那契 10。由于计算斐波那契 10 所用的时间小于 30,因此应该首先执行第二个线程。我没有从下面的代码块中得到想要的结果。
如何在 Haskell 中实现最短作业优先调度(或者可能正在使用 Haskell STM)?
代码
module Main
where
import Control.Parallel
import Control.Concurrent
import System.IO
nfib :: Int -> Int
nfib n | n <= 2 = 1
| otherwise = par n1 (pseq n2 (n1 + n2 ))
where n1 = nfib (n-1)
n2 = nfib (n-2)
type MInt = MVar Int
updateMVar :: MInt -> Int -> IO ()
updateMVar n v = do x1 <- readMVar n
let y = nfib v
x2 <- readMVar n
if x1 == x2
then do t <- takeMVar n
putMVar n y
else return()
main :: IO ()
main = do
n <- newEmptyMVar
putMVar n 0
forkIO(updateMVar n 30)
t <- readMVar n
putStrLn("n is : " ++ (show t))
forkIO(updateMVar n 10)
t <- readMVar n
putStrLn("n is : " ++ (show t))
输出
n is : 832040
n is : 55
【问题讨论】:
-
您的
main是连续的。您不需要在某处为作业分叉线程吗? -
@DonStewart,我无法理解。请详细说明。谢谢。
-
@DonStewart,我已经更新了代码 [forkIO()],但得到了相同的结果。
标签: multithreading haskell concurrency