当前位置: 首页 > 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这样的框架,而不是手写依赖

相关文章:

  • 论文笔记 - 《Implementing block-sparse matrix multiplication kernels using Triton》
  • Linux【7】------Linux系统编程(进程间通信IPC)
  • docker-compose和docker下载
  • mysql DQL(javaweb第七天)
  • 博客:基本框架设计(下)
  • 搭建第一个 Vite 项目
  • 【读论文】DiffPhyCon 扩散物理系统控制
  • 【Django】性能优化-普通版
  • C++ 网络编程(11)服务器逻辑层设计和消息完善
  • 7.7 Extracting and saving responses
  • 【医学目标检测】LN-DETR:一种基于多尺度特征融合的肺结节检测高效Transformer架构
  • Ceph分布式存储方案
  • Barcode解码 一维码、二维码识别 物流单号识别
  • ss928v100模型的导出、量化和转换
  • Kotlin的MutableList和ArrayList区别
  • Kotlin基础语法三
  • IntelliJ IDEA代码提示忽略大小写设置详解
  • 容器化包允许应用程序使用 Linux 容器
  • PyTorch:让深度学习像搭积木一样简单!!!
  • 中兴B860AV1.1_MSO9280_降级后开ADB-免刷机破解教程(非刷机)
  • 在网站上如何做天气预报栏/seo官网优化详细方法
  • 做ppt常用图片网站有哪些/seo流量软件
  • 网站按关键词显示广告图片/seo关键词排名优化官网
  • 网络销售心得体会总结/西安seo外包服务
  • 中国建设银行投诉网站/微信公众号怎么开通
  • 一般通过逸民/宁波seo网络推广产品服务