You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数内静态变量线程安全性:C++默认安全,Rust是否需用sync原语?

Rust中static变量的线程安全特性

和C++(C++11及以后函数内static初始化线程安全)不同,Rust的static变量线程安全规则由类型系统强制保证,默认并非所有static都具备线程安全特性,需分情况讨论:

  • 不可变static变量
    比如static CONST_NUM: i32 = 42;或static STR: &str = "hello";这类不可变static,会自动实现Sync trait,多线程下只读访问完全线程安全,无需额外同步原语——不可变性从根源上避免了数据竞争的可能。

  • 可变static变量(static mut)
    这类变量默认不满足Sync trait,Rust安全代码会直接禁止跨线程对其读写操作,因为无保护的多线程读写必然引发数据竞争。若要跨线程安全使用,必须借助同步原语:

    • 原子类型:比如static ATOMIC_NUM: AtomicI32 = AtomicI32::new(0);,原子类型自带线程安全的操作方法,可直接在多线程环境下修改或读取。
    • 互斥锁/读写锁:比如static MUTEXED_NUM: Mutex<i32> = Mutex::new(0);,通过lock()方法获取锁后再操作内部数据,保证同一时间只有一个线程能访问。

另外需要注意:Rust函数内部定义的static变量(比如fn bar() { static mut COUNT: u32 = 0; })本质仍是全局存储变量,仅作用域被限制在函数内,跨线程调用该函数时,对这个static的操作依然要遵循上述线程安全规则。

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:57:39