Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::超过32705个线程时出现线程\u资源\u错误_C++_Linux_Multithreading_Boost Thread - Fatal编程技术网

C++ boost::超过32705个线程时出现线程\u资源\u错误

C++ boost::超过32705个线程时出现线程\u资源\u错误,c++,linux,multithreading,boost-thread,C++,Linux,Multithreading,Boost Thread,我正在实现一个消息传递算法。消息通过图的节点传播,直到它们接收到足够的信息(来自其他邻居)来发送消息为止 如果我将每条消息放在它自己的线程中,并使用boost::condition暂停线程,直到所有需要的信息都可用,那么该算法很容易编写。我创建了数千个线程,但在任何时候都只有少数线程处于活动状态。这似乎很有效 我的问题是,当单元测试时,我发现如果我创建的线程超过32705个,那么 未知位置(0):中存在致命错误 “树测试”:标准::异常: boost::线程资源错误 我不知道这是什么原因,也不知

我正在实现一个消息传递算法。消息通过图的节点传播,直到它们接收到足够的信息(来自其他邻居)来发送消息为止

如果我将每条消息放在它自己的线程中,并使用boost::condition暂停线程,直到所有需要的信息都可用,那么该算法很容易编写。我创建了数千个线程,但在任何时候都只有少数线程处于活动状态。这似乎很有效

我的问题是,当单元测试时,我发现如果我创建的线程超过32705个,那么

未知位置(0):中存在致命错误 “树测试”:标准::异常: boost::线程资源错误

我不知道这是什么原因,也不知道如何解决。

似乎有很多可用的内存(每个线程只包含两个指针——消息在它们之间传递的对象)

从这个问题来看:我认为以下信息是相关的(尽管我真的不知道这些信息意味着什么…)

(我从60120增加了这个值-我需要重新启动吗?)

我试着去摆弄那些悬而未决的信号(我的上限非常接近这个数字的2倍) 以及使用
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