【发布时间】:2014-12-03 14:43:15
【问题描述】:
我正在编写一个 C++ 程序,它将在递归数据上运行一堆工作线程,这样即使我增加了默认堆栈空间,线程也可能会遇到堆栈溢出。
理想的做法是让堆栈根据需要动态扩展,但如果无法做到这一点,则程序失败是可以接受的,并且用户在使用更大的堆栈大小重新编译后重试是可以接受的。
程序崩溃而没有错误消息的默认行为的问题是用户无法知道问题是什么或如何处理它;就用户所知,程序可能试图除以零或取消引用空指针;所以如果程序必须崩溃,我希望它首先将“堆栈溢出”打印到标准错误。
显然,在便携式 C++ 中不会有解决方案,但我会很高兴有一个适用于 Windows 的解决方案和另一个适用于 Linux 的解决方案。
寻找在 Windows 上让程序退出并显示信息丰富的错误消息的方法,我一直在阅读有关向量化和结构化异常处理的文档;一个问题是这些似乎是线程本地的,并且线程不能安全地写入stderr;充其量你会得到一个比赛条件。
有没有已知的处理方法?
【问题讨论】:
-
我认为您可能试图以错误的方式解决此问题。如果递归算法有可能(不是经常)溢出堆栈,那么您应该将其重写为迭代。
-
@sjdowling 好吧,这并不频繁,因为我增加了堆栈大小;并且数据本质上是递归的。避免使用机器堆栈只会意味着我自己要重新实现递归,这会更慢,而且会让代码变得一头雾水。
-
但是如果你自己实现递归,当你用完它的空间时,你肯定会优雅地失败。此外,您不会很快失败,因为存储不需要是连续的。
-
@HarryJohnston 是的。尽管如此,代码既是速度关键(首先需要多个线程的原因),又是棘手且难以正确处理。首先,我愿意看看在事情开始破裂之前我可以将筹码量提高到多高。
-
[在注意到您在问题中已经提到 SEH 后,我删除了我的最后一条评论。] 无论如何,SEH 应该可以解决您的问题,您只需要正确实施即可。在线程中捕获(结构化)异常后,将消息添加到线程安全队列和/或使用独特的错误代码退出线程。
标签: c++ linux windows multithreading stack-overflow