欢迎访问宙启技术站
智能推送

使用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。

注意:由于操作系统调度的不确定性,每次运行该程序时打印的结果可能会不同。多线程程序的执行顺序是由操作系统决定的。