如何在编译期间设置线程堆栈大小?

Byr*_*ron 10 rust

当试图运行构建一个大的程序clap::App(在这里找到源代码)时,我得到一个stackoverflow : thread '<main>' has overflowed its stack.

到目前为止,我无法弄清楚如何指示rustc增加堆栈大小的强力解决方法.RUST_MIN_STACK似乎只适用于运行时,即使它似乎没有任何影响.

在生成代码时,我可能要做的就是将SubCommand创建移动到运行时,这是我接下来要尝试的.

但是,您是否看到了以不同方式解决此问题的方法?

如果构建的模式看起来容易出现这个问题,那么构建这个问题似乎非常重要,如果构建的结构只是很大并且足够嵌套.

如何重现

git clone -b clap https://github.com/Byron/google-apis-rs
cd google-apis-rs
git checkout 9a8ae4b
make dfareporting2d1-cli-cargo ARGS=run
Run Code Online (Sandbox Code Playgroud)

请注意,您将需要我的叉并在本地设置覆盖以允许使用最新的编译器进行构建.

?  google-apis-rs git:(clap) rustc --version
rustc 1.1.0-nightly (97d4e76c2 2015-04-27) (built 2015-04-28)
Run Code Online (Sandbox Code Playgroud)

小智 9

没有办法在Rust中设置主线程的堆栈大小.事实上,关于主线程堆栈大小的假设是在Rust运行时库的源代码级别进行的(https://github.com/rust-lang/rust/blob/master/src/libstd/rt/ mod.rs#L85).

环境变量会RUST_MIN_STACK影响在程序中创建的线程的堆栈大小,而不是主线程,但您可以在运行时轻松地在源代码中指定该值.

解决问题最直接的方法可能是在您创建的单独线程中运行clap,以便您可以控制其堆栈大小.

以此代码为例:

extern crate clap;
use clap::App;
use std::thread;

fn main() {
    let child = thread::Builder::new().stack_size(32 * 1024 * 1024).spawn(move || {
        return App::new("example")
            .version("v1.0-beta")
            .args_from_usage("<INPUT> 'Sets the input file to use'")
            .get_matches();
    }).unwrap();

    let matches = child.join().unwrap();

    println!("INPUT is: {}", matches.value_of("INPUT").unwrap());
}
Run Code Online (Sandbox Code Playgroud)

clap似乎能够从子线程中正确终止应用程序,因此您的代码应该可以稍作修改.