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

聊透多线程编程-线程互斥与同步-13. C# Mutex类实现线程互斥

目录

一、什么是临界区?

二、Mutex类简介

三、Mutex的基本用法

解释:

四、Mutex的工作原理

五、使用示例1-保护共享资源

解释:

六、使用示例2-跨进程同步

示例场景

1. 进程A - 主进程

2. 进程B - 第二个进程

输出结果

ProcessA 的输出

ProcessB 的输出

解释

七、注意事项

八、总结


 

在多线程编程中,线程之间的同步和互斥是确保程序正确运行的重要机制。C# 提供了多种工具来实现线程同步,其中 Mutex 是一种功能强大的同步原语,特别适合用于跨进程的线程互斥场景。本文将详细介绍如何使用 Mutex 类实现线程互斥,并通过示例展示其工作原理。


一、什么是临界区?

在多线程编程中,临界区是指一段需要互斥访问的代码块,通常涉及对共享资源的操作。为了避免多个线程同时操作共享资源而导致数据竞争或状态不一致,我们需要对临界区代码进行保护。

例如,如果两个线程同时修改一个共享变量,可能会导致最终结果不符合预期。因此,我们需要一种机制来确保同一时间只有一个线程可以进入临界区。


二、Mutex类简介

Mutex(Mutual Exclusion)类是 .NET 提供的一种线程同步工具,用于实现线程间的互斥访问。与 lockMonitor 不同,Mutex 支持跨进程的线程同步,这使得它非常适合用于多进程环境下的资源保护。

Mutex 的主要特点包括:

  • 跨进程支持Mutex 可以在不同进程之间共享,适用于分布式或多进程应用。
  • 独占锁:同一时间只有一个线程(或进程)可以持有 Mutex
  • 命名支持:可以通过命名方式创建全局 Mutex,从而实现跨进程同步。

三、Mutex的基本用法

Mutex 的基本用法包括以下几个步骤:

  1. 创建 Mutex 对象。
  2. 调用 WaitOne 方法获取锁。
  3. 执行需要同步的代码块。
  4. 调用 ReleaseMutex 方法释放锁。

为了确保资源的正确释放,通常会将 Mutex 放入 using 块中,这样即使发生异常,也能保证资源被正确释放。

using System;
using System.Threading;class Program
{private static readonly Mutex _mutex = new Mutex(); // 创建 Mutex 对象static void Main(){Thread t1 = new Thread(DoWork);Thread t2 = new Thread(DoWork);t1.Start();t2.Start();t1.Join();t2.Join();}static void DoWork(){Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}: Waiting for mutex...");_mutex.WaitOne(); // 获取锁try{Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}: Entered critical section.");Thread.Sleep(2000); // 模拟一些工作}finally{_mutex.ReleaseMutex(); // 释放锁Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}: Released mutex.");}}
}

解释:

  • _mutex.WaitOne():尝试获取锁。如果锁已被占用,则当前线程会被阻塞,直到锁可用。
  • _mutex.ReleaseMutex():释放锁,允许其他线程获取该锁。
  • 使用 try-finally 块是为了确保即使发生异常,锁也能被正确释放。

四、Mutex的工作原理

Mutex 的核心思想是基于操作系统级别的信号量机制,提供了更高级别的同步能力:

  1. 当线程调用 WaitOne 方法时,它会尝试获取 Mutex。如果 Mutex 已被其他线程占用,则当前线程会被挂起,直到 Mutex 可用。
  2. 当线程调用 ReleaseMutex 方法时,它会释放 Mutex,允许其他线程获取该锁。
  3. 如果 Mutex 是命名的(通过构造函数指定名称),它可以跨进程共享,从而实现跨进程同步。

五、使用示例1-保护共享资源

下面是一个使用 Mutex 类保护共享资源的例子:

using System;
using System.Threading;class Program
{private static int _counter = 0;private static readonly Mutex _mutex = new Mutex();static void Main(){Thread t1 = new Thread(IncrementCounter);Thread t2 = new Thread(IncrementCounter);t1.Start();t2.Start();t1.Join();t2.Join();_mutex.Dispose();Console.WriteLine($"Final Counter Value: {_counter}");}static void IncrementCounter(){for (int i = 0; i < 100000; i++){_mutex.WaitOne();try{_counter++;}finally{_mutex.ReleaseMutex();}}}
}

解释:

  • _mutex 是一个静态对象,用于标识锁。
  • 每次访问 _counter 时,都会通过 WaitOne 获取锁,并通过 ReleaseMutex 释放锁。
  • 最终输出的结果是 200000,因为所有线程的操作都被正确同步了。

六、使用示例2-跨进程同步

Mutex 的跨进程同步能力使其非常适合用于分布式或多进程环境中的资源共享和互斥访问。下面通过一个完整的例子,演示如何使用命名的 Mutex 来实现跨进程同步。

示例场景

假设我们有两个独立的应用程序(进程),它们都需要访问一个共享资源(例如文件或数据库)。为了避免数据竞争,我们需要确保同一时间只有一个进程可以访问该资源。我们将使用命名的 Mutex 来实现这一目标。

1. 进程A - 主进程

这是第一个应用程序,它尝试获取 Mutex 并独占访问共享资源。

// ProcessA.cs
using System;
using System.Threading;class Program
{static void Main(string[] args){// 创建一个命名的 Mutexbool isCreatedNew; // 是否是第一个创建 Mutex 的进程using (Mutex mutex = new Mutex(true, "Global\\SharedResourceMutex", out isCreatedNew)){if (isCreatedNew){Console.WriteLine("Process A: This process owns the mutex.");Console.WriteLine("Process A: Accessing shared resource...");// 模拟对共享资源的操作Thread.Sleep(50000); // 假设操作需要 5 秒                Console.WriteLine("Process A: Releasing mutex.");//释放锁mutex.ReleaseMutex();}else{Console.WriteLine("Process A: Another process already owns the mutex. Waiting...");// 等待其他进程释放 Mutexmutex.WaitOne();Console.WriteLine("Process A: Acquired mutex after waiting.");// 模拟对共享资源的操作Console.WriteLine("Process A: Accessing shared resource...");Thread.Sleep(5000);Console.WriteLine("Process A: Releasing mutex.");//释放锁mutex.ReleaseMutex();}}}
}

2. 进程B - 第二个进程

这是第二个应用程序,它也会尝试获取同一个 Mutex,并访问共享资源。

// ProcessB.cs
using System;
using System.Threading;class Program
{static void Main(string[] args){// 创建一个命名的 Mutexbool isCreatedNew; // 是否是第一个创建 Mutex 的进程using (Mutex mutex = new Mutex(true, "Global\\SharedResourceMutex", out isCreatedNew)){try{if (isCreatedNew){Console.WriteLine("Process B: This process owns the mutex.");Console.WriteLine("Process B: Accessing shared resource...");// 模拟对共享资源的操作Thread.Sleep(5000); // 假设操作需要 5 秒Console.WriteLine("Process B: Releasing mutex.");//释放锁mutex.ReleaseMutex();}else{Console.WriteLine("Process B: Another process already owns the mutex. Waiting...");// 等待其他进程释放 Mutexmutex.WaitOne();Console.WriteLine("Process B: Acquired mutex after waiting.");// 模拟对共享资源的操作Console.WriteLine("Process B: Accessing shared resource...");Thread.Sleep(5000);Console.WriteLine("Process B: Releasing mutex.");//释放锁mutex.ReleaseMutex();}}catch (AbandonedMutexException){Console.WriteLine("Process B: Detected an abandoned mutex. Continuing execution...");// 即使检测到被遗弃的 Mutex,当前线程仍然可以继续执行。}}}
}

输出结果

ProcessA 的输出

Process A: This process owns the mutex.
Process A: Accessing shared resource...
Process A: Releasing mutex.

ProcessB 的输出

Process B: Another process already owns the mutex. Waiting...
Process B: Acquired mutex after waiting.
Process B: Accessing shared resource...
Process B: Releasing mutex.

解释

  1. 命名的 Mutex

    • 在 new Mutex(true, "Global\\SharedResourceMutex", out isCreatedNew) 中,"Global\\SharedResourceMutex" 是 Mutex 的名称。
    • Global\\ 前缀表示该 Mutex 是全局的,可以在不同进程之间共享。
  2. 跨进程同步

    • 当 ProcessA 创建 Mutex 时,isCreatedNew 为 true,表示它是第一个创建该 Mutex 的进程。
    • 当 ProcessB 尝试创建同名的 Mutex 时,isCreatedNew 为 false,表示该 Mutex 已存在,并由另一个进程持有。
  3. 等待与释放

    • 如果 Mutex 已被占用,调用 mutex.WaitOne() 会使当前线程阻塞,直到 Mutex 被释放。
    • 调用 mutex.ReleaseMutex() 会释放 Mutex,允许其他线程或进程获取它。

七、注意事项

  1. 命名冲突

    • 命名的 Mutex 必须具有唯一性,避免与其他应用程序发生冲突。
    • 可以使用 GUID 或特定的前缀来确保名称的唯一性。
  2. 性能开销

    • Mutex 是基于操作系统级别的同步机制,性能开销较大,尤其是在高并发场景下。
    • 对于单进程内的线程同步,推荐使用 lock 或 Monitor
  3. 死锁风险

    • 如果一个进程获取了 Mutex 但未释放,会导致其他进程永远无法获取锁。
    • 确保在 finally 块中调用 ReleaseMutex,避免因异常导致锁未释放。
  4. 权限问题

    • 在某些情况下,创建全局 Mutex 可能需要管理员权限,尤其是在 Windows 系统中。
  5. 为什么使用 using

    • 将 Mutex 放入 using 块中可以确保资源的正确释放,避免资源泄漏。
    • 即使发生异常,Dispose 方法也会被自动调用,保证资源管理的安全性和可靠性。

八、总结

Mutex 类是 C# 中实现线程互斥的一种重要工具,特别适合用于跨进程的线程同步场景。尽管它的使用稍微复杂一些,但能够满足更多高级需求,例如分布式系统中的资源保护。

在实际开发中,选择合适的同步机制非常重要。对于简单的线程互斥场景,lockMonitor 可能更为直观;而对于需要跨进程同步的场景,Mutex 则是一个不错的选择。通过合理利用 Mutex,我们可以有效避免数据竞争和资源冲突,确保多线程或多进程应用的稳定性和可靠性。

 

相关文章:

聊透多线程编程-线程互斥与同步-13. C# Mutex类实现线程互斥

目录 一、什么是临界区&#xff1f; 二、Mutex类简介 三、Mutex的基本用法 解释&#xff1a; 四、Mutex的工作原理 五、使用示例1-保护共享资源 解释&#xff1a; 六、使用示例2-跨进程同步 示例场景 1. 进程A - 主进程 2. 进程B - 第二个进程 输出结果 ProcessA …...

Halcon应用:相机标定之应用

提示&#xff1a;若没有查找的算子&#xff0c;可以评论区留言&#xff0c;会尽快更新 Halcon应用&#xff1a;相机标定之应用 前言一、Halcon应用&#xff1f;二、应用实战1、如何应用标定&#xff08;快速&#xff09;2、代码讲解&#xff08;重要&#xff09;2.1 、我们还是…...

【计算机视觉】CV实战项目- CMU目标检测与跟踪系统 Object Detection Tracking for Surveillance Video

CMU 目标检测与跟踪系统&#xff08;Object Detection & Tracking for Surveillance Video&#xff09; 1. 项目概述2. 技术亮点&#xff08;1&#xff09;目标检测模型&#xff08;2&#xff09;多目标跟踪&#xff08;MOT&#xff09;&#xff08;3&#xff09;重识别&am…...

报错 | 配置 postcss 出现 报错:A `require()` style import is forbidden.

背景&#xff1a;安装 postcss&#xff0c;配置时&#xff0c;出现报错&#xff1a;A require() style import is forbidden. 翻译&#xff1a;禁止导入require&#xff08;&#xff09;样式 解决&#xff1a;前头添加 /* eslint-env node */ &#xff0c;也飘红&#xff0c…...

[Qt]双击事件导致的问题

有如下代码 #include "mymodel.h" #include <QDebug>myModel::myModel(QObject *parent) : QAbstractTableModel(parent) {status << Qt::Unchecked << Qt::Unchecked << Qt::Unchecked; }int myModel::rowCount(const QModelIndex &pa…...

[SpringBoot]配置文件

通过案例可以不难发现&#xff0c;springboot实际上就是spring的一种辅助工具&#xff0c;帮我们更快地使用spring开发。尤其是配置这块&#xff0c;注解springboot解决了很多繁琐重复的配置操作。 但在实际开发需求&#xff0c;当然不可能只用springboot已经配置好的配置信息。…...

前端框架开发编译阶段与运行时的核心内容详解Tree Shaking核心实现原理详解

前端框架开发编译阶段与运行时的核心内容详解 一、开发编译阶段 开发编译阶段是前端框架将源代码转换为浏览器可执行代码的核心过程,涉及代码转换、优化和资源整合。 模块打包与依赖管理 • 依赖图构建:工具(如Webpack、Vile)通过静态分析生成模块依赖关系图,支持按需加载…...

idea2024.1双击快捷方式打不开

idea2024.1突然双击快捷方式打不开&#xff0c;使用管理员运行也打不开 在安装的idea路径下的bin目录下双击打开idea.bat文件&#xff0c;要是打不开使用txt格式打开&#xff0c;打开后在最后一行加上pause&#xff0c;之后保存。 看看报错信息是不是有一个initializedExcept…...

鸿蒙NEXT开发LRUCache缓存工具类(单例模式)(ArkTs)

import { util } from kit.ArkTS;/*** LRUCache缓存工具类&#xff08;单例模式&#xff09;* author 鸿蒙布道师* since 2025/04/21*/ export class LRUCacheUtil {private static instance: LRUCacheUtil;private lruCache: util.LRUCache<string, any>;/*** 私有构造函…...

开源身份和访问管理(IAM)解决方案:Keycloak

一、Keycloak介绍 1、什么是 Keycloak&#xff1f; Keycloak 是一个开源的身份和访问管理&#xff08;Identity and Access Management - IAM&#xff09;解决方案。它旨在为现代应用程序和服务提供安全保障&#xff0c;简化身份验证和授权过程。Keycloak 提供了集中式的用户…...

Latex科研入门教程

Introduction 这篇文章适合有markdown基础的人看,不会的人可以先去学一下markdown. 仅适用于科研入门. 本文使用的latex环境为overleaf Latex概况 文件格式 以.tex为结尾的文件可能有多个.tex文件最终只编译一个文件,相当于一个文件控制其他子文件. Latex 代码分为三种&…...

CSS 中实现 div 居中有以下几种常用方法

在 CSS 中实现 div 居中有以下几种常用方法&#xff0c;具体取决于需要 ​​水平居中​​、​​垂直居中​​ 还是 ​​两者兼具​​。以下是详细解决方案&#xff1a; 目录 一、水平居中&#xff08;Horizontal Centering&#xff09; 1. 行内块元素&#xff08;Inline-Blo…...

win11修改文件后缀名

一、问题描述 win11系统中&#xff0c;直接添加.py后缀后仍然是txt文本文件 二、处理方式&#xff1a; 点击上方三个小点点击“选项”按钮 点击“查看”取消“隐藏已知文件类型的扩展名”选项点击“应用” 此时&#xff0c;“.txt”文件后缀显示出来了。将txt删去&#xff0c…...

【数据结构和算法】3. 排序算法

本文根据 数据结构和算法入门 视频记录 文章目录 1. 排序算法2. 插入排序 Insertion Sort2.1 概念2.2 具体步骤2.3 Java 实现2.4 复杂度分析 3. 快排 QuickSort3.1 概念3.2 具体步骤3.3 Java实现3.4 复杂度分析 4. 归并排序 MergeSort4.1 概念4.2 递归具体步骤4.3 Java实现4.4…...

k8s之 kube-prometheus监控

Kubernetes 中的 kube-prometheus 是一个基于 Prometheus Operator 的完整监控解决方案&#xff0c;它集成了 Prometheus、Alertmanager、Grafana 以及一系列预定义的监控规则和仪表盘&#xff0c;专为 Kubernetes 集群设计。 一、核心组件介绍 Prometheus Operator &#xf…...

Docker Compose 和 Kubernetes(k8s)区别

前言&#xff1a;Docker Compose 和 Kubernetes&#xff08;k8s&#xff09;是容器化技术中两个常用的工具&#xff0c;但它们的定位、功能和适用场景有显著区别。以下是两者的核心对比&#xff1a; ​​1. 定位与目标​​ ​​特性​​ ​​Docker Compose​​ ​​Kubernet…...

【SpringBoot】HttpServletRequest获取使用及失效问题(包含@Async异步执行方案)

目录 1. 在 Controller 方法中作为参数注入 2.使用 RequestContextHolder &#xff08;1&#xff09;失效问题 &#xff08;2&#xff09;解决方案一&#xff1a; &#xff08;3&#xff09;解决方案二&#xff1a; 3、使用AutoWrite自动注入HttpServletRequest 跨线程调…...

【Easylive】为什么需要手动转换 feign.Response 到 HttpServletResponse

【Easylive】项目常见问题解答&#xff08;自用&持续更新中…&#xff09; 汇总版 为什么需要手动转换 feign.Response 到 HttpServletResponse&#xff1f; feign.Response 是 Feign 客户端调用远程服务后返回的原始 HTTP 响应对象&#xff0c;而 HttpServletResponse 是…...

C语言交换函数:为什么必须用指针传递参数?

写一个简单交换两个变量值的函数,我们要理解C语言中参数传递的机制. C语言中的函数参数默认是按值传递,也就是说,如果我写一个函数,如 void swap(int a,int b) {int tmp a;a b;b tmp; }然后在函数内部交换a,b的值,这不会影响到函数外部的变量,因为传递的是值的副本. 就像…...

C#+Visual Studio 2022为AutoCAD 2022开发插件并显示在Ribbon选项卡

1.插件功能开发 &#xff08;1&#xff09;建立C#类库项目&#xff0c;添加必要引用&#xff0c;都是autocad二次开发相关的&#xff0c;要注意对引用的库修改其“复制文件”属性为false (2)项目调试使用“属性”打开“启用外部程序”&#xff0c;指定为机器上autocad2022的a…...

全景VR是什么?全景VR有什么热门用途?

全景VR的概念与技术特点 全景VR&#xff0c;即虚拟现实全景&#xff0c;是新型的视觉展示技术。通过拍摄和构建三维模拟环境&#xff0c;使浏览者能够通过网络获得三维立体的空间感觉&#xff0c;仿佛身临其境。全景VR技术的核心在于360全景图像的捕捉和展示&#xff0c;它允许…...

美创科技20周年庆典顺利举行

2025年4月19日 美创科技成立20周年 “稳健前行二十载&#xff0c;创新共赢新未来” 美创科技周年庆典在杭州总部顺利举行 美创科技20周年庆典精彩视频回顾 &#xff08;点击查看美创科技20周年庆典精彩视频回顾&#xff09; CEO致辞 20周年再出发&#xff0c;开启新增长周期…...

学习笔记二十二—— 并发五大常见陷阱

⚠️ 并发五大常见陷阱 目录 数据竞争 (Data Race)死锁 (Deadlock)竞态条件 & 饿死现象 (Race Condition & Starvation)悬挂指针 (Dangling Pointer)重复释放 (Double Free)开发自查清单 1. 数据竞争 (Data Race) 专业定义 两个及以上线程在缺乏同步的情况下同时访问同…...

精益数据分析(10/126):深度剖析数据指标,驱动创业决策

精益数据分析&#xff08;10/126&#xff09;&#xff1a;深度剖析数据指标&#xff0c;驱动创业决策 在创业的旅程中&#xff0c;数据指标是我们把握方向的关键工具。今天&#xff0c;我想和大家一起深入学习《精益数据分析》中关于数据指标的知识&#xff0c;共同探索如何利…...

冒泡排序详解

void bubbleSort(std::vector& arr) { int n arr.size(); for (int i 0; i < n-1 ; i) { // 需要 n-1 轮 原理是 3个元素 两轮比交即可 10个元素9轮比较即可 bool swapped false; // 用于优化&#xff0c;检测是否发生交换 for (int j 0; j < n - i -1 ; j) { //…...

小刚说C语言刷题——1039 求三个数的最大数

1.题目描述 已知有三个不等的数&#xff0c;将其中的最大数找出来。 输入 输入只有一行&#xff0c;包括3个整数。之间用一个空格分开。 输出 输出只有一行&#xff08;这意味着末尾有一个回车符号&#xff09;&#xff0c;包括1个整数。 样例 输入 1 5 8 输出 8 2.…...

【日志体系】ELK Stack与云原生日志服务

IaaS日志体系&#xff1a;ELK Stack与云原生日志服务 一、技术演进的双重脉络二、架构设计的范式差异三、关键技术突破解析四、前沿发展与行业实践 当某国际电商平台在"黑色星期五"遭遇每秒百万级日志洪峰时&#xff0c;其运维团队通过混合日志架构实现全链路追踪&am…...

spark和hadoop区别联系

区别 设计理念 Hadoop&#xff1a;主要解决大规模数据的存储和处理问题&#xff0c;其核心是 Hadoop 分布式文件系统&#xff08;HDFS&#xff09;和 MapReduce 计算模型。HDFS 用于存储大规模数据&#xff0c;MapReduce 用于处理数据&#xff0c;它将数据处理过程分为 Map 和…...

240422 leetcode exercises

240422 leetcode exercises jarringslee 文章目录 240422 leetcode exercises[237. 删除链表中的节点](https://leetcode.cn/problems/delete-node-in-a-linked-list/)&#x1f501;节点覆盖法 [392. 判断子序列](https://leetcode.cn/problems/is-subsequence/)&#x1f501;…...

【上位机——MFC】菜单类与工具栏

菜单类 CMenu&#xff0c;封装了关于菜单的各种操作成员函数&#xff0c;另外还封装了一个非常重要的成员变量m_hMenu(菜单句柄) 菜单使用 添加菜单资源加载菜单 工具栏相关类 CToolBarCtrl-》父类是CWnd&#xff0c;封装了关于工具栏控件的各种操作。 CToolBar-》父类是CC…...

Spark-SQL连接Hive总结及实验

一、核心模式与配置要点 1. 内嵌Hive 无需额外配置&#xff0c;直接使用&#xff0c;但生产环境中几乎不使用。 2. 外部Hive&#xff08;spark-shell连接&#xff09; 配置文件&#xff1a;将hive-site.xml&#xff08;修改数据库连接为node01&#xff09;、core-site.xml、…...

20.3 使用技巧9

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的 20.3.13 DataGridView使用日期选择控件 有时为了输入方便或者固定日期格式&#xff0c;可以考虑点击DataGridView中某个单元格时出现…...

逻辑回归(Logistic Regression)

逻辑回归&#xff08;Logistic Regression&#xff09; 原理 通过 Sigmoid函数&#xff08; σ ( z ) 1 1 e − z σ(z) \frac{1}{1e^{-z}} σ(z)1e−z1​&#xff09;将线性回归输出 z w T x b z w^Tx b zwTxb 映射到 [0,1] 区间输出值表示样本属于正类的概率&#…...

weblogic12 部署war包 项目运行报错

问题表现 weblogic12 部署war包项目成功&#xff0c;运行启动成功。但是在使用此项目的时候&#xff0c;点击任何功能都会报错&#xff0c;部分报错如下&#xff1a; at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.…...

重新定义户外防护!基于DeepSeek的智能展开伞棚系统技术深度解析

从“手动操作”到“感知决策”&#xff0c;AI重构城市空间弹性 全球极端天气事件频发&#xff0c;传统伞棚依赖人工展开/收纳&#xff0c;存在响应滞后&#xff08;暴雨突袭时展开需3-5分钟&#xff09;、抗风能力弱&#xff08;8级风损毁率超60%&#xff09;、空间利用率低等痛…...

Android15沉浸式界面顶部有问题

Android15沉浸式界面顶部有问题 往往开发人员的手机没这么高级&#xff0c;客户或者老板的手机是Android15的。 我明明就设了状态栏透明&#xff0c;我的手机也没问题。但Android15是有问题的。 先看下有问题的界面&#xff1a; 解决方案&#xff1a; 处理1&#xff1a; if (…...

git比较不同分支的不同提交文件差异

背景&#xff1a;只想比较某2个分支的某2次提交的差异&#xff0c;不需要带上父提交。 以commitA为基准&#xff0c;用commitB去比较差异 直接上代码&#xff1a; #!/bin/bashcommitAd347dad9f25fb17db89eadcec7ea0f1bacbf7d29 commitBa6cc0c1a863b5c56d5f48bff396e4cd6966e…...

ADB -> pull指令推送电脑文件到手机上

ADB Push命令 在Android开发中&#xff0c;ADB的push命令用于将文件从电脑传输到Android设备上&#xff0c;是开发和测试过程中的重要工具 基本语法 adb push <本地文件路径> <设备目标路径><本地文件路径>&#xff1a;必需参数&#xff0c;指定要推送的本…...

compat-openssl10和libnsl下载安装

在麒麟系统&#xff08;如银河麒麟&#xff09;中&#xff0c;compat-openssl10 和 libnsl 是一些软件&#xff08;如 MySQL、Oracle 等&#xff09;的依赖包&#xff0c;用于提供兼容性支持。以下是它们的下载方法&#xff1a; 1. 下载 compat-openssl10 compat-openssl10 是…...

‌射频功率放大器的核心工作机制与组件设计

以下是关于射频功率放大器工作原理的详细说明&#xff1a; 射频功率放大器&#xff08;RF PA&#xff09;是无线通信系统的核心组件&#xff0c;其功能基于能量转换与信号放大技术。它通过精确的能量控制与信号处理&#xff0c;将低功率射频信号转化为高功率输出&#xff0c;支…...

制作一款打飞机游戏12:初稿原型

当前进展 ‌任务回顾‌&#xff1a;在之前&#xff0c;我们做了大量的规划和原型设计。我们创建了关卡&#xff0c;添加了侧向滚动和BOSS模式背景重复&#xff0c;还制作了一个紧凑的瓦片集。‌原型完成‌&#xff1a;我们完成了五个原型&#xff0c;基本实现了飞机飞行、滚动…...

C语言高频面试题——指针数组和数组指针

指针数组和数组指针是 C/C 中容易混淆的两个概念&#xff0c;以下是详细对比&#xff1a; 1. 指针数组&#xff08;Array of Pointers&#xff09; 定义&#xff1a;一个数组&#xff0c;其元素是 指针类型。语法&#xff1a;type* arr[元素个数]; 例如&#xff1a;int* ptr_a…...

爱普生TG-5006CG成为提升5G RedCap时钟同步精度的理想选择

在 5G 通信技术持续演进的进程中,5G RedCap&#xff08;Reduced Capability,即降低能力&#xff09;是5G技术中针对物联网场景优化的一种轻量化标准。它通过降低终端带宽、简化天线配置和调制方式等手段&#xff0c;大幅降低了终端设备的成本和功耗&#xff0c;同时继承了5G NR…...

用Mac M4构建多架构Docker镜像指南

使用Mac M4构建多架构Docker镜像指南 解决问题&#xff1a;WARNING: The requested image‘s platform (linux/amd64) does not match the detected host platform &#x1f4cc; 重点&#xff1a;为什么需要双栈架构镜像&#xff1f; 双栈架构镜像&#xff08;同时支持ARM64和…...

PCB原理图解析(炸鸡派为例)

晶振 这是外部晶振的原理图。 32.768kHz 的晶振&#xff0c;常用于实时时钟&#xff08;RTC&#xff09;电路&#xff0c;因为它的频率恰好是一天的分数&#xff08;32768 秒&#xff09;&#xff0c;便于实现秒计数。 C25 和 C24&#xff1a;两个 12pF 的电容&#xff0c;用于…...

GPU高效利用率实战揭秘:蓝耘元生代VS传统云平台的降维打击

文章目录 一、前言&#xff1a;AI算力革命与蓝耘元生代的崛起二、蓝耘元生代智算云核心架构解析2.1 技术基石&#xff1a;Kubernetes原生云与蜂巢式资源网络关键创新点&#xff1a; 2.2 核心功能模块 三、蓝耘元生代快速入门指南3.1 注册与资源申请3.2 实战案例&#xff1a;部署…...

EXCEL学习

一、基本计算 求和 SUM(区域)&#xff1a;计算区域内数值总和。示例&#xff1a;SUM(A1:A10) 计算A1到A10的和。 平均值 AVERAGE(区域)&#xff1a;计算区域内数值的平均值。示例&#xff1a;AVERAGE(B1:B10) 计算B1到B10的平均值。 计数 COUNT(区域)&#xff1a;统计区域内非…...

PyTorch 线性回归详解:模型定义、保存、加载与网络结构

目录 前言一、pytorch框架线性回归1.1 pytorch模型的定义1.2 nn.Sequential()1.2.1 nn.Linear1.2.2 nn.Sequential 1.3 nn.ModuleList()1.4 nn.ModuleDict()1.5 nn.Module二、pytorch模型的保存2.1 保存模型的权重和其他参数2.1.1 torch.save()保存字典总结 前言 书接上文 自…...

基础服务系列-Jupyter Notebook 支持JavaScript

IJavascript is a Javascript kernel for the Jupyter notebook. npm install npm i -g ijavascript 报以上错误&#xff0c;执行以下命令。 npm i -g ijavascript --unsafe-perm 说明&#xff1a;npm会有生命周期&#xff0c;某个包会有生命周期来执行一些东西&#xff0c;…...

LabVIEW数据采集与传感系统

开发了一个基于LabVIEW的智能数据采集系统&#xff0c;该系统主要通过单片机与LabVIEW软件协同工作&#xff0c;实现对多通道低频传感器信号的有效采集、处理与显示。系统的设计旨在提高数据采集的准确性和效率&#xff0c;适用于各种需要高精度和低成本解决方案的工业场合。 项…...