记录rust滥用lazy_static导致的一个bug

记录rust滥用lazy_static导致的一个bug

本质就是lock以后task crash后导致其他线程饿死;在cpp20的coroutine也有类似场景

1. 模拟代码

toml

复制代码
[package]
name = "rust-crash-collect-20250611"
version = "0.1.0"
edition = "2024"

[dependencies]
tokio = { version = "1.40.0", features = ["full"] }
lazy_static = "1.5.0"

代码

rust 复制代码
use std::sync::Mutex;

lazy_static::lazy_static! {
    static ref COUNTER: Mutex<i32> = Mutex::new(0);
}

struct raii {
    name: String,
}

impl Drop for raii {
    fn drop(&mut self) {
        println!("Dropping raii");
    }
}

#[tokio::main]
async fn main() {
    for cnt in 0..10 {
        tokio::spawn(async move {
            let raii = raii {
                name: format!("raii {}", cnt),
            };
            let mut counter = COUNTER.lock();
            match counter {
                Ok(mut counter) => {
                    *counter += 1;
                    println!("counter: {}", *counter);
                    if *counter == 5 {
                        panic!("Counter is 5");
                    }
                }
                Err(e) => {
                    println!("Error: {}", e);
                }
            }
        });
    }
    loop {}
}

1.1 执行结果

sh 复制代码
cargo run

2. 解决方案

2.1 如果task不依赖其他组件

因业务上tokiospawntask可以移除lock且能够独立,故将变量以move的形式实现。

2.2 如果task有依赖

暂没思路

3. 经验

  1. 在multi thread编程中,尽量使用纯函数,不要过多依赖全局变量
  2. 如果有依赖尽量使用dag这样的框架,而不是手写依赖
相关推荐
Z1Jxxx14 小时前
01序列01序列
开发语言·c++·算法
汽车仪器仪表相关领域15 小时前
全自动化精准检测,赋能高效年检——NHD-6108全自动远、近光检测仪项目实战分享
大数据·人工智能·功能测试·算法·安全·自动化·压力测试
Doro再努力16 小时前
【数据结构08】队列实现及练习
数据结构·算法
清铎17 小时前
leetcode_day12_滑动窗口_《绝境求生》
python·算法·leetcode·动态规划
linweidong17 小时前
嵌入式电机:如何在低速和高负载状态下保持FOC(Field-Oriented Control)算法的电流控制稳定?
stm32·单片机·算法
net3m3317 小时前
单片机屏幕多级菜单系统之当前屏幕号+屏幕菜单当前深度 机制
c语言·c++·算法
mmz120718 小时前
二分查找(c++)
开发语言·c++·算法
Insight18 小时前
拒绝手动 Copy!一文吃透 PyTorch/NumPy 中的广播机制 (Broadcasting)
算法
CoovallyAIHub18 小时前
工业视觉检测:多模态大模型的诱惑
深度学习·算法·计算机视觉
Jayden_Ruan18 小时前
C++分解质因数
数据结构·c++·算法