在运行时获取Rust的默认栈大小
如何在运行时获取 默认的Rust堆栈大小?
查看 rustc 代码,存在一个 pub static STACK_SIZE。但我如何从 std 或 core 访问这个值?
我知道 堆栈大小因平台而异,所以我想在运行时获取当前平台的默认值。
理想情况下,使用稳定的API接口,而不是需要基于编译目标进行编译时分支的API调用。
我的目标是在创建线程之前确定线程的堆栈大小会是多少。
我尝试了一些路径,但它们没有编译通过;std::thread::STACK_SIZE、std::thread::DEFAULT_STACK_SIZE、std::thread::stack_size()、std::thread::Builder::STACK_SIZE 等等。
解决方案
堆栈大小
默认的堆栈大小是平台相关的,可能会变化。目前在所有Tier-1平台上都是2 MiB。
看起来你想要的功能目前似乎并未在API中提供。我建议将以下代码作为近似实现:
static DEFAULT_STACK_SIZE: LazyLock<usize> = LazyLock::new(|| {
// https://github.com/rust-lang/rust/blob/a72e2a71d8fbcbc46cdd18784e2ab2c32cbd9c93/library/std/src/sys/thread/unix.rs#L26
// https://github.com/rust-lang/rust/blob/a72e2a71d8fbcbc46cdd18784e2ab2c32cbd9c93/library/std/src/sys/thread/windows.rs#L14
const DEFAULT_MIN_STACK_SIZE: usize = 2 * 1024 * 1024;
// https://github.com/rust-lang/rust/blob/a72e2a71d8fbcbc46cdd18784e2ab2c32cbd9c93/library/std/src/thread/lifecycle.rs#L37-L39
std::env::var_os("RUST_MIN_STACK")
.and_then(|s| s.to_str().and_then(|s| s.parse().ok()))
.unwrap_or(DEFAULT_MIN_STACK_SIZE)
});
你可能还希望实际设置线程的 stack_size 以保持一致性:
const STACK_SIZE: usize = 2 * 1024 * 1024;
std::thread::Builder::new().stack_size(STACK_SIZE).spawn(...)
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。