使用Haskell编写一个多线程程序
发布时间:2023-12-09 21:30:13
Haskell是一种支持多线程编程的函数式编程语言,它提供了一些用于创建和控制多线程的库函数和类型。下面是一个使用Haskell编写的多线程程序的示例,该示例使用四个线程对一个共享变量进行加法操作。
import Control.Concurrent
import Control.Monad
main :: IO ()
main = do
-- 创建共享变量和信号量
sharedVar <- newMVar 0
-- 创建四个线程并启动它们
replicateM_ 4 (forkIO $ worker sharedVar)
-- 等待所有线程执行完毕
threadDelay 1000000
-- 从共享变量中读取结果并输出
finalResult <- takeMVar sharedVar
putStrLn $ "Final result: " ++ show finalResult
worker :: MVar Int -> IO ()
worker sharedVar = do
-- 获取共享变量的锁和当前值
currentValue <- takeMVar sharedVar
-- 执行加法操作并将结果存回共享变量
let newValue = currentValue + 1
putMVar sharedVar newValue
-- 打印当前线程的操作结果
threadId <- myThreadId
putStrLn $ "Thread " ++ show threadId ++ ": " ++ show newValue
-- 释放共享变量的锁
putMVar sharedVar currentValue
在这个例子中,我们首先创建了一个共享变量sharedVar和一个信号量来保护它。然后,我们使用replicateM_函数创建了四个线程,并使用forkIO函数将它们启动。每个线程都会调用worker函数,在这个函数中,我们首先获取共享变量的锁,并将其当前值存储到currentValue中。然后,我们执行加法操作,将结果newValue存回共享变量,并打印当前线程的操作结果。最后,我们释放共享变量的锁。
运行该程序时,输出可能会如下所示:
Thread ThreadId 10: ThreadId 10: 1 Thread ThreadId 11: ThreadId 11: 3 Thread ThreadId 12: ThreadId 12: 4 Thread ThreadId 13: ThreadId 13: 2 Final result: 4
从输出结果可以看出,四个线程分别对共享变量执行了加法操作,并且各自按顺序打印出了操作结果。最终,共享变量的值为4。
注意:由于操作系统调度的不确定性,每次运行该程序时打印的结果可能会不同。多线程程序的执行顺序是由操作系统决定的。
