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

标签 multithreading haskell concurrency

我有以下程序:

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/

相关文章:

java - 允许数组中的线程不安全

logging - 监控负载下的 log4j 行为

java - 是否有任何理由使用同步的 HashMap 而不是 ConcurrentHashMap?

c# - 在 C# 中使用 SFTP 时的线程最佳实践

java - 多线程和继承

C# 线程性能,一个线程 99% 的时间

haskell - IO 类型的链接函数(可能是 a )

c++ - 在运行时选择互斥量或虚拟互斥量

algorithm - Haskell:如果我尝试超过 55 步,Knight tour 永远不会结束?

haskell - Haskell 中的调试循环