【问题标题】:How to set the thread stack size during compile time?如何在编译期间设置线程堆栈大小?
【发布时间】:2015-07-08 09:11:03
【问题描述】:

当尝试运行构建大型 clap::App (find the source here) 的程序时,我得到一个堆栈溢出: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

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

➜  google-apis-rs git:(clap) rustc --version
rustc 1.1.0-nightly (97d4e76c2 2015-04-27) (built 2015-04-28)

【问题讨论】:

  • 我猜它是特定于操作系统的。

标签: rust


【解决方案1】:

在 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());
}

clap 似乎能够从子线程中正确终止应用程序,因此您的代码只需稍作修改即可工作。

【讨论】:

  • 感谢您指出这一点!我仍然希望能够在编译时为主线程设置这个值——也许有一天它会被 rustc 支持。
猜你喜欢
  • 2014-11-03
  • 2014-09-21
  • 2015-11-11
  • 2017-12-28
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
相关资源
最近更新 更多