记录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这样的框架,而不是手写依赖
相关推荐
不爱吃炸鸡柳17 分钟前
算法复杂度从入门到精通:时间与空间复杂度全解析
开发语言·c++·算法
拳里剑气22 分钟前
C++算法:二分查找
c++·算法·二分查找·学习方法
黎阳之光34 分钟前
去标签化定位时代:黎阳之光自研技术,可见即可定位,无感亦能解算
大数据·人工智能·算法·安全·数字孪生
故事和你9143 分钟前
洛谷-算法1-7-搜索2
数据结构·c++·算法·leetcode·深度优先·动态规划·图论
炽烈小老头1 小时前
【每天学习一点算法 2026/094/14】分数到小数
学习·算法
_深海凉_1 小时前
LeetCode热题100-和为 K 的子数组
数据结构·算法
深紫色的三北六号1 小时前
仿大疆司空2面状航线生成——凸多边形区域航线生成算法详解
java·算法·无人机·大疆·航线规划
ServBay2 小时前
这9个高性能的Rust库不容错过
后端·rust
YuanDaima20482 小时前
双指针基础原理与题目说明
数据结构·人工智能·python·算法·leetcode·手撕代码