gpt4 book ai didi

multithreading - 尝试创建多个线程时程序崩溃

转载 作者:行者123 更新时间:2023-12-01 13:01:09 26 4
gpt4 key购买 nike

我有以下程序:

module Main where

import System (getArgs)
import Control.Concurrent
import Control.Monad

spawn left id = do
right <- newEmptyMVar
forkIO (thread id left right)
return right

thread id left right = go
where go = do l <- takeMVar left
putStrLn (show id)
putMVar right ()

main = do
args <- getArgs
if null args then
putStrLn "Arguments not supplied"
else do
initial <- newEmptyMVar
final <- foldM spawn initial [1..(read (head args))]
putMVar initial ()
takeMVar final

如您所见,它只是创建了一堆线程:每个线程打印一个整数,但第二个线程在打印前等待第一个,第三个等待第二个,依此类推。我们先不讨论这个程序的用处(它只是一个练习)。

现在,当我尝试创建一百万个线程时,程序被 SIGKILL 杀死。我想知道这是为什么。是因为 MVar 太多了吗?

谢谢。

最佳答案

创建的每个线程都需要自己的程序堆栈。我实际上并不知道 Haskell 为其线程使用了多大的堆栈,但如果它是 4kbytes(实际上这将是非常小的)那将是 4GB 仅用于百万个堆栈。如果您使用的是 32 位机器,那是所有可寻址内存,所以这显然行不通。典型的堆栈大小更像是一兆字节!

关于multithreading - 尝试创建多个线程时程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5935852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com