记录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这样的框架,而不是手写依赖
相关推荐
QiLinkOS7 小时前
第三视觉理解徐玉生与他的商业活动(30)
大数据·c++·人工智能·算法·开源协议
疯狂打码的少年7 小时前
【操作系统】页面置换算法(OPT/FIFO/LRU)
算法
小O的算法实验室8 小时前
2026年CIE,优化客货协同运输:综合地铁系统的列车容量动态分配
算法
Coder_Shenshen8 小时前
西门子S7CommPlus协议鉴权算法原理与流程详解
网络·后端·算法
硕风和炜9 小时前
【LeetCode: 2492. 两个城市间路径的最小分数 + DFS】
java·算法·leetcode·深度优先·dfs·bfs·并查集
我是一颗柠檬10 小时前
【Java项目技术亮点】加权轮询负载均衡算法
java·算法·负载均衡
灯厂码农10 小时前
C语言动态内存分配完全指南(malloc、calloc、realloc、free)
java·c语言·算法
doiito(Do It Together)11 小时前
media_agent 进化之路:把 Gliding Horse 的 Agent 超能力注入 ComfyUI,让图片生成自己“学会”优化
人工智能·架构·rust·knowledge graph
凯瑟琳.奥古斯特11 小时前
K次取反最大化数组和解法(力扣1005)
开发语言·c++·算法·leetcode·职场和发展
Jerry12 小时前
LeetCode 203. 移除链表元素
算法