C++ boost::超过32705个线程时出现线程\u资源\u错误
我正在实现一个消息传递算法。消息通过图的节点传播,直到它们接收到足够的信息(来自其他邻居)来发送消息为止 如果我将每条消息放在它自己的线程中,并使用boost::condition暂停线程,直到所有需要的信息都可用,那么该算法很容易编写。我创建了数千个线程,但在任何时候都只有少数线程处于活动状态。这似乎很有效 我的问题是,当单元测试时,我发现如果我创建的线程超过32705个,那么 未知位置(0):中存在致命错误 “树测试”:标准::异常: boost::线程资源错误 我不知道这是什么原因,也不知道如何解决。 似乎有很多可用的内存(每个线程只包含两个指针——消息在它们之间传递的对象) 从这个问题来看:我认为以下信息是相关的(尽管我真的不知道这些信息意味着什么…) (我从60120增加了这个值-我需要重新启动吗?) 我试着去摆弄那些悬而未决的信号(我的上限非常接近这个数字的2倍) 以及使用C++ boost::超过32705个线程时出现线程\u资源\u错误,c++,linux,multithreading,boost-thread,C++,Linux,Multithreading,Boost Thread,我正在实现一个消息传递算法。消息通过图的节点传播,直到它们接收到足够的信息(来自其他邻居)来发送消息为止 如果我将每条消息放在它自己的线程中,并使用boost::condition暂停线程,直到所有需要的信息都可用,那么该算法很容易编写。我创建了数千个线程,但在任何时候都只有少数线程处于活动状态。这似乎很有效 我的问题是,当单元测试时,我发现如果我创建的线程超过32705个,那么 未知位置(0):中存在致命错误 “树测试”:标准::异常: boost::线程资源错误 我不知道这是什么原因,也不知
ulimit-S-i8191的堆栈大小(我无法增加它),但这些更改似乎根本没有效果)
我使用的是64位Ubuntu-10-10,如果这有帮助的话…我认为系统上有32K个线程,你应该看看潜在的解决方案,而不是如何拥有更多线程。例如,一个线程池(Boost为此提供了一些功能)
无论如何,在您的系统上,PIDs不限于32768或类似的值吗?你迟早会用完的,我想,不妨设计一个系统,允许处理超过最大线程数的项目
也就是说,查看/proc/sys/kernel/pid_max以查看您的最大pid——并尝试增加它。这可能会使您超过32K(但也可能会导致非为异常大的PID设计的程序出现意外行为,因此要小心)
然后您可能会受到堆栈空间的限制(与虚拟内存空间相反)。如果愿意,您可以尝试创建具有较小堆栈的线程。好的,回答这个问题:您需要增加
/proc/sys/vm/max_map_count
正如这里所讨论的:
在这里:
但是:要想找到更好的方法,请看下面的问题:
这实际上取决于堆栈的大小,但如果创建大量线程,地址空间(32位)或虚拟内存(64位)将耗尽
在LinuxPthreads中,上次检查时默认堆栈大小为10Mb;这意味着32k线程使用320G的地址空间(请注意,它可能会被延迟初始化,因此不会使用那么多虚拟内存);这可能太多了
即使您使堆栈非常小,并且不以这种方式耗尽内存,32k线程也会为堆栈使用大量虚拟内存。考虑使用不同的方法。
ulimit只影响初始线程的堆栈大小(在Linux下通常是动态的);其他线程的堆栈大小是固定的,由pthread库在线程创建时设置。32k线程?!!!真的@内特一次只跑了几个?他们大多数人都睡着了。。。我认为电脑在唤醒他们方面应该比我做得更好…@汤姆:线程很便宜,但不是免费的。您正在创建数千个线程,这些线程什么都不做,但确实占用了一些资源(例如,计划程序需要了解它们)。32705 threads=设计失败,请重新考虑您的逻辑。@Sam 32705对我来说很好。算法很快,代码又短又透明——问题出在32706上。我已经达到了系统限制,但我不知道是哪一个?只是不要说我没有警告你,当成千上万的线程再次困扰你时。@Tom:你的设计只是一个糟糕的方法,那就是线程太多了。堆栈空间问题可以通过减少每个线程的堆栈大小来解决。有了足够的创可贴,我们可以触摸天空@汤姆:我明白你为什么这么做,我是说你的理由不是一个好理由。当然,可能是别的原因。如果有几件事情需要改变才能使系统运行异常多的进程/线程,我也不会感到惊讶。Mark Russinovich做了一系列关于各种窗口限制的研究,其中包括线程和进程()。请不要这样做。首先,你到底要怎么调试它?但更重要的是,你极有可能被第一个维护你的代码的人谋杀。@Luke-是的,我现在正在切换模式->编辑答案
~>ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
/proc/sys/vm/max_map_count