当前位置: 首页 > news >正文

记录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"

代码

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 执行结果

cargo run

在这里插入图片描述

2. 解决方案

2.1 如果task不依赖其他组件

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

2.2 如果task有依赖

暂没思路

3. 经验

  1. 在multi thread编程中,尽量使用纯函数,不要过多依赖全局变量
  2. 如果有依赖尽量使用dag这样的框架,而不是手写依赖
http://www.xdnf.cn/news/976393.html

相关文章:

  • Android 应用被kill问题排查和处理
  • 【DeepSeek×Draw.io 轻松构建UML】智能协作,高效建模
  • UE5 学习系列(八)材质基础认知
  • WPP 媒体推出基于人工智能的工具突破基于身份识别的定向模式
  • Idea 2025 commit 关闭侧边栏 开启探框
  • web程序设计期末复习-填空题
  • SLAM3R:基于单目视频的实时密集3D场景重建
  • uniapp 页面栈一定深度后,回首页导航到新页面的解决方案
  • 量子加速器切入 AI 底层架构!能源焦虑时代,ORCA 正在改写数据中心的计算逻辑
  • 开疆智能ModbusTCP转Canopen网关连接汇川AM403PLC与编码器配置案例
  • Arduino入门教程:1、Arduino硬件介绍
  • 【Zephyr 系列 18】分布式传感网络系统设计:从 BLE Mesh 到边缘网关的数据闭环
  • onnx 模型转 rknn 部署 rk3588 开发板
  • Python `glob` 库详解:优雅高效地批量匹配文件路径
  • 在 Java 中实现一个标准 Service 接口,并通过配置动态选择具体实现类供 Controller 调用
  • 用Woot助力Prime Day
  • 深入解析Docker网桥模式:从docker0到容器网络的完整通信链路
  • TBrun测试工具使用教程(Windows)
  • R语言缓释制剂QBD解决方案之一
  • 开源项目实战学习之YOLO11:12.9 ultralytics-models-sam-amg.py
  • 如何选择合适的IP轮换周期
  • 建筑末端配电回路安全用电解决方案:筑牢电气防火最后一道防线
  • 句法分析 自然语言处理
  • thinkphp ThinkPHP3.2.3完全开发手册
  • React前端框架学习
  • 腾讯云TVP走进泸州老窖,解码AI数智未来
  • 机器学习与深度学习19-线性代数02
  • 青少年编程与数学 01-011 系统软件简介 14 Foxpro数据库
  • 【从零开始学习JVM | 第六篇】运行时数据区
  • 使用Apache POI操作Word文档:从入门到实战