如何增加 Rust 库可用的堆栈大小?

Posted

技术标签:

【中文标题】如何增加 Rust 库可用的堆栈大小?【英文标题】:How to increase the stack size available to a Rust library? 【发布时间】:2017-10-15 15:51:52 【问题描述】:

我正在玩 lambda 演算,希望有更多的堆栈空间来构建和计算(非常)长的函数链。有没有办法为 crate 增加它,类似于增加递归限制 (#![recursion_limit = "100"])?

crate 是一个库,我希望它能够执行堆栈密集型操作,而不管目标操作系统如何。

【问题讨论】:

您想增加编译器在stack of your program上运行的堆栈的堆栈大小吗? @LukasKalbertodt 问题发生在货物测试期间,溢出的线程是libname-hash.exe,所以我猜它毕竟是程序。 【参考方案1】:

这不是语言功能,而是操作系统功能。在 *nix 系统上,您将使用像 ulimit 这样的工具。其他系统可能使用其他工具:

How to change the stack size using ulimit or per process on Mac OS X for a C or Ruby program? How to increase stack size permanently on Windows 7?

【讨论】:

@ljedrz:我注意到std::thread::Builder 允许您从程序中指定创建线程的堆栈大小。只有 main 线程的堆栈大小由操作系统设置。 @MatthieuM。你真的可以这样设置像 256MB 这样的堆栈大小吗?另外,链接到 Rust 1.8 文档?最好链接到the current docs,它阐明了unit stack_size 需要什么。 @Shepmaster:我把链接归咎于谷歌 ;) 至于最大堆栈大小,它可能确实受到操作系统或底层线程实现的限制,但你可以 i> 在 Rust 中对其进行调整。 @MatthieuM。我的印象是ulimit(和其他操作系统等效项)是控制最大值的东西;你知道这是不是真的吗? @Shepmaster:不知道,我唯一一次遇到 *** 是因为无限递归,所以修复是在逻辑中,而不是在操作系统中。不过我不使用 FreeBSD,因为它的小堆栈(我认为默认为 1MB 或 2MB)而臭名昭著。【参考方案2】:

经过一些研究,我得出结论,没有一种通用的方法可以实现我所追求的目标,但是使用std::thread::Builder 我能够创建一个具有指定堆栈大小的额外线程并在其中执行大量堆栈操作:

fn huge_reduction() 
    let builder = thread::Builder::new()
                  .name("reductor".into())
                  .stack_size(32 * 1024 * 1024); // 32MB of stack space

    let handler = builder.spawn(|| 
        // stack-intensive operations
    ).unwrap();

    handler.join().unwrap();

【讨论】:

以上是关于如何增加 Rust 库可用的堆栈大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 c 代码中提取所有库函数的堆栈大小?

Rust 堆栈大小 [重复]

Rust - 调试与发布模式的堆栈大小是不是不同?

是否可以在 Rust 运行时确定大小的堆栈分配数组?

使用 WinRM 增加 ScriptMethods 的堆栈大小

如何增加python中的堆栈大小