C# Interlocked 类使用详解
总目录
前言
在多线程编程中,确保多个线程对共享资源的安全访问是一个关键挑战。C# 提供了多种同步机制来处理并发问题,其中 System.Threading.Interlocked 类提供了一种轻量级的方法来进行原子操作。它允许您执行一些常见的增量、减量、交换等操作,并保证这些操作是线程安全的,即在同一时刻只有一个线程可以修改共享数据。
一、Interlocked 相关概念介绍
1. 原子操作
1) 定义
原子操作指的是那些在执行过程中不可被中断的操作。也就是说,一旦原子操作开始执行,它会在不被其他线程干扰的情况下完整执行完毕,要么全部执行成功,要么全部不执行,不会出现执行到一半被其他线程打断的情况。在多线程环境下,原子操作能够保证数据的一致性和完整性。
2) 原理
原子操作的实现通常依赖于硬件层面的支持。现代 CPU 提供了一些特殊的指令,例如比较并交换(Compare - And - Swap, CAS)指令。这些指令可以在一个时钟周期内完成对内存的读取、比较和写入操作,并且在执行过程中不会被其他 CPU 核心的操作打断。Interlocked 类就是利用这些硬件指令来实现原子操作的,它会调用底层的 CPU 指令,确保操作的原子性。
3)作用
在多线程环境中,多个线程可能同时访问和修改共享资源。如果没有适当的同步机制,就可能出现数据竞争的问题,导致数据不一致或程序出现不可预期的结果。原子操作可以避免这种情况的发生,因为它保证了对共享资源的操作是线程安全的。例如,多个线程同时对一个共享的计数器进行递增操作,如果不使用原子操作,可能会出现多个线程同时读取到相同的计数器值,然后各自加 1 后写回,最终导致计数器的值增加的结果不符合预期。而使用原子操作,就能确保每次递增操作都是独立且完整的。
2. 数据竞争
1) 定义
数据竞争指的是在多线程环境中,两个或多个线程同时访问共享数据,并且至少有一个线程对该共享数据进行写操作,同时又没有使用合适的同步机制来协调这些访问,从而导致数据的不一致性或程序产生不可预期的结果。
2) 原因
- 线程调度的不确定性:操作系统负责线程的调度,它会根据自身的调度算法在不同线程之间切换执行。这就使得多个线程对共享数据的访问顺序变得不可预测,可能会出现一个线程正在修改数据时,另一个线程同时读取或修改该数据的情况。
- 缺乏同步机制:如果在多线程程序中没有使用合适的同步机制(如锁、原子操作等)来控制对共享数据的访问,各个线程就会随意地访问和修改共享数据,进而引发数据竞争。
3) 示例
以下是一个简单的示例,展示了数据竞争的情况:
using System;
using System.Threading;class Program
{private static int sharedCounter = 0;static void Main(){// 创建两个线程Thread thread1 = new Thread(IncrementCounter);Thread thread2 = new Thread(IncrementCounter);// 启动线程thread1.Start();thread2.Start();// 等待两个线程执行完毕thread1.Join();thread2.Join();// 输出最终的计数器值Console.WriteLine($"Final counter value: {sharedCounter}");//第一次输出结果: Final counter value: 1226406//第二次输出结果: Final counter value: 1551244// ...// 会发现每次输出的结果都不一样}static void IncrementCounter(){for (int i = 0; i < 100_0000; i++){sharedCounter++;}}
}
在这个示例中,两个线程同时对 sharedCounter 进行递增操作。sharedCounter++ 实际上包含了三个步骤:读取 sharedCounter 的值、将该值加 1、再将结果写回 sharedCounter。由于线程调度的不确定性,可能会出现以下情况:
- 线程 1 读取 sharedCounter 的值为 10。
- 线程 2 也读取 sharedCounter 的值,此时由于线程 1 还未完成写操作,所以线程 2 读到的值也是 10。
- 线程 1 将 10 加 1 得到 11,并写回 sharedCounter。
- 线程 2 同样将 10 加 1 得到 11,并写回 sharedCounter。
这样一来,两次递增操作实际上只让 sharedCounter 的值增加了 1,而不是 2,最终导致计数器的值比预期的要小,这就是数据竞争的具体表现。
4)危害
- 数据不一致:数据竞争会使共享数据的值变得不可预测,不同线程可能会看到不同版本的数据,导致程序的状态混乱。
- 程序崩溃:在某些情况下,数据竞争可能会导致程序出现未定义行为,进而引发程序崩溃或产生难以调试的错误。
- 结果不可重复:由于数据竞争的发生依赖于线程调度的不确定性,所以程序的运行结果可能每次都不一样,这给程序的调试和测试带来了极大的困难。
5)解决办法
- 使用锁机制:可以使用 lock 关键字(在 C# 中)或其他同步原语(如 Mutex、Semaphore 等)来确保同一时间只有一个线程能够访问共享数据。例如,将上述示例中的 IncrementCounter 方法修改如下:
private static readonly object lockObject = new object();static void IncrementCounter()
{for (int i = 0; i < 100_0000; i++){lock (lockObject){sharedCounter++;}}
}// 输出结果: Final counter value: 2000000
- 使用原子操作:对于一些简单的共享数据操作(如整数的递增、递减等),可以使用 Interlocked 类提供的原子操作方法,这些方法可以确保操作的原子性,避免数据竞争。例如:
static void IncrementCounter()
{for (int i = 0; i < 100_0000; i++){Interlocked.Increment(ref sharedCounter);}
}
// 输出结果: Final counter value: 2000000
3. Interlocked 类
通过以上内容和相关示例,我们知道为什么要使用 Interlocked 类?因为 Interlocked 类提供的一些原子操作方法,这些方法可以确保操作的原子性,避免多线程场景下的数据竞争问题。
下面我们就具体详细的了解一下 Interlocked
Interlocked
类位于 System.Threading
命名空间,是一组静态方法的集合。它提供的方法能保证对共享变量的操作以原子方式执行,即这些操作在执行过程中不会被其他线程中断。这有效避免了多线程环境下的数据竞争问题,确保数据的一致性和完整性。
Interlocked 用于执行无锁(lock-free)的原子操作。这些方法可以直接在共享变量上工作,而不需要显式的锁定机制(如 lock 语句),从而减少了死锁和其他同步问题的风险。由于它们是基于硬件级别的原子指令实现的,因此通常比传统的锁更高效。
假设我们有一个计数器需要在多个线程间安全地递增。我们可以利用 Interlocked.Increment 来避免竞态条件
class Counter
{private long count = 0;public void Increment(){Interlocked.Increment(ref count);}public long GetCount(){return count;}
}// 在多个线程中调用Increment方法
var counter = new Counter();
Parallel.For(0, 1000, i => counter.Increment());
Console.WriteLine(counter.GetCount()); // 应输出1000
二、Interlocked 常用方法
1. Interlocked.Add
- 介绍:该方法接受两个参数,一个是要修改的目标变量的引用,另一个是要添加到目标变量上的数值。它同样以原子方式执行加法并返回新的值。
- 功能:以原子操作的方式将指定值加到共享变量上,并返回相加后的结果。
- 语法:
public static int Add(ref int location1, int value);
此方法有针对不同数值类型的重载,如long、float、double等。 - 示例:
using System;
using System.Threading;class Program
{private static int sharedValue = 0;static void Main(){Thread thread1 = new Thread(() =>{for (int i = 0; i < 1000; i++){Interlocked.Add(ref sharedValue, 1);}});Thread thread2 = new Thread(() =>{for (int i = 0; i < 1000; i++){Interlocked.Add(ref sharedValue, 1);}});thread1.Start();thread2.Start();thread1.Join();thread2.Join();Console.WriteLine($"Final value: {sharedValue}");}
}
- 说明:在上述代码中,两个线程同时尝试对sharedValue进行累加操作。如果不使用Interlocked.Add,由于线程调度的不确定性,可能会导致数据竞争,最终结果可能不是预期的 2000。而Interlocked.Add确保了每次累加操作的原子性,保证了结果的正确性。
2. Interlocked.Increment 和 Interlocked.Decrement
- 介绍:这两个方法分别用于将指定位置的整数值加1或减1。它们返回更新后的值,并且保证此操作是原子性的,不会受到其他线程的影响。
- 功能:Interlocked.Increment 以原子操作的方式递增共享变量,并返回操作后的值;Interlocked.Decrement 则以原子操作的方式递减共享变量,并返回操作后的值。
- 语法:
public static int Increment(ref int location);
和public static int Decrement(ref int location);
同样有针对不同数值类型的重载。 - 示例:
using System;
using System.Threading;class Program
{private static int counter = 0;static void Main(){Thread incrementThread = new Thread(() =>{for (int i = 0; i < 500; i++){Interlocked.Increment(ref counter);}});Thread decrementThread = new Thread(() =>{for (int i = 0; i < 500; i++){Interlocked.Decrement(ref counter);}});incrementThread.Start();decrementThread.Start();incrementThread.Join();decrementThread.Join();Console.WriteLine($"Final counter value: {counter}");}
}
- 说明:该示例展示了如何在多线程环境中安全地对计数器进行递增和递减操作。Interlocked.Increment 和 Interlocked.Decrement 保证了这些操作不会因线程切换而出现数据不一致的情况。
3. Interlocked.Exchange
-
介绍:Exchange 方法会用新值替换目标变量的旧值,并返回原来的值。这有助于在线程之间传递信息而不必担心竞争条件。
-
功能:以原子操作的方式用新值替换共享变量的旧值,并返回旧值。
-
语法:public static int Exchange(ref int location1, int value); 有多种数据类型的重载。
-
示例:
using System;
using System.Threading;class Program
{private static int sharedNumber = 10;static void Main(){Thread thread = new Thread(() =>{int oldValue = Interlocked.Exchange(ref sharedNumber, 20);Console.WriteLine($"Old value: {oldValue}"); //Old value: 10});thread.Start();thread.Join();Console.WriteLine($"New value: {sharedNumber}"); //New value: 20}
}
- 说明:在此示例中,线程通过Interlocked.Exchange方法将sharedNumber的值替换为 20,并获取原来的值。这个操作是原子的,不会受到其他线程干扰。
4. Interlocked.CompareExchange
-
介绍:这是最强大的一个方法,它尝试将目标变量设置为新值,但仅当其当前值等于预期值时才会成功。如果匹配失败,则保持不变,并返回实际的旧值。这对于实现自旋锁或其他复杂的同步逻辑非常有用。
-
功能:以原子操作的方式比较共享变量的值与给定值,如果相等,则用新值替换共享变量的值,并返回共享变量的原始值。常用于实现无锁算法。
-
语法:public static int CompareExchange(ref int location1, int value, int comparand); 同样支持多种数据类型的重载。
-
示例:
using System;
using System.Threading;class Program
{private static int sharedValue = 5;static void Main(){int comparisonValue = 5;int newValue = 10;// 如果sharedValue等于comparisonValue,则将其设置为newValueint result = Interlocked.CompareExchange(ref sharedValue, newValue, comparisonValue);if (result == comparisonValue){Console.WriteLine($"Value was successfully updated to {newValue}");}else{Console.WriteLine($"Value was not updated. Current value: {sharedValue}");}}
}
- 说明:在上述代码中,Interlocked.CompareExchange方法首先比较sharedValue与comparisonValue,如果相等,则将sharedValue更新为newValue。通过返回值可以判断更新是否成功,这在多线程环境下实现复杂同步逻辑时非常有用。
三、使用须知
-
性能考量:虽然Interlocked操作是原子的,但在高并发场景下,频繁调用可能会带来一定的性能开销。在实际应用中,应根据具体需求权衡使用。
-
适用场景:Interlocked主要适用于简单数据类型的原子操作,如计数器、标志位翻转等。对于复杂对象的同步,可能需要使用其他同步机制,如lock语句、Monitor类等。
-
无锁优势:Interlocked 的原子操作避免了传统锁带来的上下文切换开销,对于高频率的小型操作来说性能优越。
-
硬件支持:Interlocked 操作依赖于CPU提供的原子指令集,所以在现代多核处理器上表现良好。
-
最小化作用域:尽量缩小 Interlocked 操作的作用范围,只保护真正需要同步的部分代码。
-
组合使用:虽然 Interlocked 提供了基本的原子操作,但在某些情况下可能需要与 Monitor, Semaphore, 或者 ReaderWriterLockSlim 等高级同步原语结合起来使用。
四、Interlocked类和lock关键字区别
在 C# 多线程编程中,Interlocked类和lock关键字都用于处理线程安全问题,但它们在功能、实现方式、适用场景等方面存在明显区别:
1. 功能特性
- Interlocked类:提供的是原子操作,确保对简单数据类型(如int、long等)的特定操作(如加减、交换、比较交换)在多线程环境下以原子方式执行,不会被其他线程中断。例如Interlocked.Add方法,在多个线程同时对一个共享整数变量进行累加时,能保证每次累加操作的完整性,避免数据竞争。
- lock关键字:用于锁定一个对象,在同一时间只允许一个线程进入被锁定的代码块,从而保证这段代码在多线程环境下的线程安全性。它可以保护任何类型的共享资源,不仅限于简单数据类型。
2. 实现方式
- Interlocked类:基于硬件指令实现原子操作,通常依赖于 CPU 提供的特殊指令,如cmpxchg(比较并交换指令)等。这些硬件指令保证了操作的原子性,操作系统和编译器会确保这些指令在执行过程中不会被打断。
- lock关键字:是基于Monitor类实现的语法糖。lock语句在进入代码块时获取对象的锁,离开代码块时释放锁。当一个线程获取了锁,其他线程试图进入被锁定的代码块时,会被阻塞,直到锁被释放。
3. 适用场景
- Interlocked类:适用于对简单数据类型进行简单的、独立的原子操作场景。例如,在多线程环境下统计某个事件发生的次数,使用Interlocked.Increment就非常合适。由于其操作的原子性是基于硬件指令,性能开销相对较小,在高并发场景下,如果只需要对简单数据进行这类原子操作,Interlocked类是较好的选择。
- lock关键字:适用于保护复杂的代码块或对复杂对象的操作。当需要保证一段代码中多个操作的原子性,或者需要对多个共享资源进行协调访问时,lock关键字更为合适。比如,在多线程环境下对一个共享的集合进行读写操作,为了避免数据不一致,就可以使用lock关键字来锁定集合对象,确保同一时间只有一个线程能访问该集合。
4. 性能表现
- Interlocked类:由于基于硬件指令,在对简单数据类型的原子操作上性能较高。特别是在高并发场景下,频繁的Interlocked操作带来的性能开销相对较小,因为它不需要像lock那样进行复杂的锁获取和释放操作。
- lock关键字:虽然能保护复杂的代码逻辑,但由于涉及到线程的阻塞和唤醒,在高并发场景下,如果锁的竞争激烈,会导致性能下降。因为被阻塞的线程需要等待锁的释放,这期间会消耗系统资源,并且线程上下文的切换也会带来额外的开销。
结语
回到目录页:C#/.NET 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。
参考资料:
Interlocked 类
Interlocked 类,原子操作
相关文章:
C# Interlocked 类使用详解
总目录 前言 在多线程编程中,确保多个线程对共享资源的安全访问是一个关键挑战。C# 提供了多种同步机制来处理并发问题,其中 System.Threading.Interlocked 类提供了一种轻量级的方法来进行原子操作。它允许您执行一些常见的增量、减量、交换等操作&…...
SYN Flooding的攻击原理
SYN Flooding是一种常见的网络攻击方式,属于拒绝服务攻击(DoS)的一种,其攻击原理主要是利用了TCP协议的三次握手过程,以下是具体介绍: TCP三次握手正常流程 第一次握手:客户端向服务器发送一个…...
Mono里运行C#脚本35—加载C#语言基类的过程
前面大体地分析了整个Mono运行过程,主要从文件的加载,再到EXE文件的入口点, 然后到方法的编译,机器代码的生成,再到函数调用的跳板转换,进而解析递归地实现JIT。 但是还有很多功能没有解析的,就是C#语言相关最多的,就是类的加载,以及类语言设计的实现属性, 比如类的…...
类包含类 三角分形 面向对象
Cad c# Sj类的构造函数,直接包含电线和三个分形三角形。...
Flutter:搜索页,搜索bar封装
view 使用内置的Chip简化布局 import package:chenyanzhenxuan/common/index.dart; import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:get/get.dart; import package:tdesign_flutter/tdesign_flutter.dart;import i…...
chrome插件:网页图片高清下载
前置条件: 安装有chrome谷歌浏览器的电脑 使用步骤: 1.打开chrome扩展插件 2.点击管理扩展程序 3.加载已解压的扩展程序 4.选择对应文件夹 5.成功后会出现一个扩展小程序 6.点击对应小程序 7.输入需要访问的网址,点击扩展插件即可进行图片…...
docker 简要笔记
文章目录 一、前提内容1、docker 环境准备2、docker-compose 环境准备3、流程说明 二、打包 docker 镜像1、基础镜像2、国内镜像源3、基础的dockerfile4、打包镜像 四、构建运行1、docker 部分2、docker-compose 部分2.1、构建docker-compose.yml2.1.1、同目录构建2.1.2、利用镜…...
Java I/O 流介绍
Java学习资料 Java学习资料 Java学习资料 一、引言 在 Java 编程中,I/O(Input/Output)流是处理输入和输出操作的核心机制。它允许程序与外部设备(如文件、网络连接、键盘、显示器等)进行数据交互。通过使用 I/O 流&…...
C# OpenCV机器视觉:利用CNN实现快速模板匹配
在一个阳光灿烂的周末,阿强正瘫在沙发上,百无聊赖地换着电视频道。突然,一则新闻吸引了他的注意:某博物馆里一幅珍贵的古画离奇失踪,警方怀疑是被一伙狡猾的盗贼偷走了,现场只留下一些模糊不清的监控画面&a…...
数据结构——实验七·排序
欢迎各位大佬们来到Tubishu的博客🌟 Tubishu是一名计算机本科生,不定期发送一些在学校的成果供佬们消遣~希望能为佬的编程之路添砖加瓦⭐🔥 求各位大佬们垂怜🔥点赞评论一下呗🔥🔥 本文专栏 ➡️ 数据结构 …...
Flutter_学习记录_Tab的简单Demo~真的很简单
1. Tab的简单使用了解 要实现tab(选项卡或者标签视图)需要用到三个组件: TabBarTabBarViewTabController 这一块,我也不知道怎么整理了,直接提供代码吧: import package:flutter/material.dart;void main() {runApp(MyApp());…...
const的用法
文章目录 一、C和C中const修饰变量的区别二、const和一级指针的结合const修饰的量常出现的错误是:const和一级指针的结合总结:const和指针的类型转换公式 三、const和二级指针的结合 一、C和C中const修饰变量的区别 C中:const必须初始化,叫常…...
分布式微服务系统简述
distributed microservice 分布式与微服务的定义及关系;分布式微服务架构里的各组件,如:配置中心、服务注册/发现、服务网关、负载均衡器、限流降级、断路器、服务调用、分布式事务等;spring cloud 介绍及实现案例,如…...
Uniapp开发总结
一、tabBar 如果应用是一个多 tab 应用,可以通过 tabBar 配置项指定一级导航栏,以及 tab 切换时显示的对应页。 pages.json 页面路由 | uni-app官网 pages.json基本配置: "tabBar": {"color": "#000",&quo…...
uniapp APP端页面触发调用webview(页面为uniapp开发的H5)里的方法
原理: 使用 getCurrentInstance() 获取当前组件的 Vue 实例,通过 instance.proxy.$scope.$getAppWebview() 获取 Uniapp 的原生 WebView 对象。 使用 WebView 提供的 evalJS 方法,执行嵌入 H5 页面内的 JavaScript 代码 <template>&l…...
Qt 5.14.2 学习记录 —— 이십 QFile和多线程
文章目录 1、QFile1、打开2、读写3、关闭4、程序5、其它功能 2、多线程1、演示2、锁 3、条件变量和信号量 1、QFile Qt有自己的一套文件体系,不过Qt也可以使用C,C,Linux的文件操作。使用Qt的文件体系和Qt自己的一些类型更好配合。 管理写入读…...
未初始化数据恢复全攻略
没有初始化概述 在日常使用电脑、硬盘、U盘等存储设备时,我们可能会遇到“没有初始化”的提示。这一情况通常发生在存储设备突然无法被系统正常识别或访问时,系统往往要求我们先进行初始化操作。然而,初始化操作意味着对存储设备进行格式化&…...
自动驾驶中的多传感器时间同步
目录 前言 1.多传感器时间特点 2.统一时钟源 2.1 时钟源 2.2 PPSGPRMC 2.3 PTP 2.4 全域架构时间同步方案 3.时间戳误差 3.1 硬件同步 3.2 软件同步 3.2.3 其他方式 ① ROS 中的 message_filters 包 ② 双端队列 std::deque 参考: 前言 对多传感器数据…...
三元组抽取在实际应用中如何处理语义模糊性?
在实际应用中,三元组抽取面临语义模糊性的问题,这主要体现在输入文本的非规范描述、复杂句式以及多义性等方面。为了有效处理这种模糊性,研究者们提出了多种方法和技术,以下是一些关键策略: 基于深度学习的方法 深度学…...
代码随想录刷题day16|(哈希表篇)349.两个数组的交集
目录 一、哈希表理论基础 二、集合set在哈希法中的应用 三、相关算法题目 四、相关知识点 1.set集合特点和常用方法 1.1 set集合概述 1.2 set集合特点 1.3 常用方法 2.set集合转换成数组 法1:另新建一个数组 法2:将结果集合转为数组 ▲ 3.数组…...
浅谈Redis
2007 年,一位程序员和朋友一起创建了一个网站。为了解决这个网站的负载问题,他自己定制了一个数据库。于2009 年开发,称之为Redis。这位意大利程序员是萨尔瓦托勒桑菲利波(Salvatore Sanfilippo),他被称为Redis之父,更…...
整数的个数(信息学奥赛一本通-1067)
【题目描述】 给定k(1<k<100)个正整数,其中每个数都是大于等于1,小于等于10的数。写程序计算给定的k个正整数中,1,5和10出现的次数。 【输入】 输入有两行:第一行包含一个正整数k,第二行包含k个正整数…...
macos的图标过大,这是因为有自己的设计规范
苹果官方链接:App 图标 | Apple Developer Documentation 这个在官方文档里有说明,并且提供了sketch 和 ps 的模板。 figma还提供了模板: Figma...
C++17 命名空间的新特性:简化与优化的典范
文章目录 1. 简化的嵌套命名空间1.1 背景与问题1.2 C17的解决方案1.3 实际应用场景1.4 注意事项 2. 声明多个名称的using声明2.1 背景与问题2.2 C17的解决方案2.3 实际应用场景2.4 注意事项 3. 属性命名空间的简化3.1 背景与问题3.2 C17的解决方案3.3 实际应用场景3.4 注意事项…...
使用python-docx包进行多文件word文字、字符批量替换
1、首先下载pycharm。 2、改为中文。 3、安装python-docx包。 搜索包名字,安装。 4、新建py文件,写程序。 from docx import Documentdef replace1(array1):# 替换词典(标签值按实际情况修改)dic {替换词1: array1[0], 替换…...
模块初阶学习
当我们在过去想要实现一个功能时,例如Swap交换函数时,我们需要不断考虑参数的正确与否。如果是在c语言,我们还需要不断更改函数名字,以防止函数名重复。在c我们可以通过函数名重载解决这个问题,但还是有一些小问题&…...
华为 Ascend 平台 YOLOv5 目标检测推理教程
1. 背景介绍 随着人工智能技术的快速发展,目标检测在智能安防、自动驾驶、工业检测等领域中扮演了重要角色。YOLOv5 是一种高效的目标检测模型,凭借其速度和精度的平衡广受欢迎。 华为 Ascend 推理框架(ACL)是 Ascend CANN 软件…...
16.好数python解法——2024年省赛蓝桥杯真题
问题描述 一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位…)上的数字是奇数,偶数位(十位、千位、十万位…)上的数字是偶数,我们就称之为“好数”。 给定一个正整数N,请计算从1到N一共有多少个好数。 输入格式 一个整数N。 输出格式 一个整数代表答案。 样例输入 1 …...
在WSL使用gnome终端
默认在windows11环境下使用WSL会打开windows终端,如果想要使用gnome终端可以进行如下操作 确保 WSLg 已启用: WSLg 默认在 Windows 11 和最新版本的 WSL 2 中启用。 检查 WSL 版本: wsl --list --verbose 如果未启用 WSLg,请更…...
评估篇| 大模型评测综述
在传统的自然语言任务下,如分类等,经常会用精确率、F1等指标,来评测模型的好坏。随着大模型技术研究的快速发展,以往的指标,对于大模型评估显得过于单薄。如何准确地评估大语言模型在不同维度的能力水平,已经成为当前研究的热点问题。为了全面考察大语言模型的有效性,研…...
Ubuntu下载zenodo文件Ubuntu download zenodo
一般数据集文件会比较大,直接下载单个压缩包很慢。可以使用代码多线程下载小文件。 环境 Ubuntu22.04 示例代码 pip3 install zenodo_get zenodo_get https://zenodo.org/records/13715870参考 https://github.com/dvolgyes/zenodo_get...
OpenHarmony 5.0.2 Release来了!
版本概述 OpenHarmony 5.0.2 Release版本对标准系统的能力进行持续完善,以快速迭代的方式推出API 14,相比5.0.1 Release版本,重点做出了如下特性新增或增强: 进一步增强ArkUI、图形图像的能力,提供更多组件的高级属性…...
蓝桥杯3519 填充 | 分类讨论
题目传送门 很简单,遍历一次字符串,将‘?’作为0或1处理,发现00和11统计次数即可。 s str(input()) cnt 0 arr [00, 11, 0?, ?0, 1?, ?1, ??] i0 while i < len(s)-1:if s[i:(i2)] in arr:i 2cnt 1else:i 1 print(cnt)END✨...
均值(信息学奥赛一本通-1060)
【题目描述】 给出一组样本数据,包含n个浮点数,计算其均值,精确到小数点后4位。 【输入】 输入有两行,第一行包含一个整数n(n小于100),代表样本容量;第二行包含n个绝对值不超过1000的…...
Windows Docker Desktop安装及使用 Docker 运行 MySQL
Docker Desktop是Docker的官方桌面版,专为Mac和Windows用户设计,提供了一个简单易用的界面来管理和运行Docker容器。它集成了Docker引擎,为开发人员提供了一个快速、可靠、可扩展的方式来构建、运行和管理应用。DockerDesktop的优势在于&…...
关于使用微服务的注意要点总结
一、防止过度设计 微服务的拆分一定要结合团队人员规模来考虑,笔者就曾遇到过一个公司的项目,是从外部采购回来的,微服务划分为十几个应用,我们在此项目基础上进行自行维护和扩展。由于公司业务规模不大,而且二次开发的…...
对于RocksDB和LSM Tree的一些理解
LSM Tree的读写过程 HBase、LevelDB,rocksDB(是一个引擎)底层的数据结构是LSM Tree适合写多读少的场景,都是追加写入内存中的MemTable,写入一条删除(或修改)标记,而不用去访问实际的…...
Pyecharts之特殊图表的独特展示
在数据可视化的世界里,除了常见的柱状图、折线图、饼图等,还有一些特殊的图表可以为我们带来独特的展示效果,帮助我们以更有趣、更直观的方式呈现数据。Pyecharts 为我们提供了多种特殊图表的绘制功能,本文将介绍象形图、水球图和…...
【Uniapp-Vue3】动态设置页面导航条的样式
1. 动态修改导航条标题 uni.setNavigationBarTitle({ title:"标题名称" }) 点击修改以后顶部导航栏的标题会从“主页”变为“动态标题” 2. 动态修改导航条颜色 uni.setNavigationBarColor({ backgroundColor:"颜色" }) 3. 动态添加导航加载动画 // 添加加…...
图像处理算法研究的程序框架
目录 1 程序框架简介 2 C#图像读取、显示、保存模块 3 C动态库图像算法模块 4 C#调用C动态库 5 演示Demo 5.1 开发环境 5.2 功能介绍 5.3 下载地址 参考 1 程序框架简介 一个图像处理算法研究的常用程序逻辑框架,如下图所示 在该框架中,将图像处…...
c语言操作符(详细讲解)
目录 前言 一、算术操作符 一元操作符: 二元操作符: 二、赋值操作符 代码例子: 三、比较操作符 相等与不相等比较操作符: 大于和小于比较操作符: 大于等于和小于等于比较操作符: 四、逻辑操作符 逻辑与&…...
神经网络|(四)概率论基础知识-古典概型
【1】引言 前序学习了线性回归的基础知识,了解到最小二乘法可以做线性回归分析,但为何最小二乘法如此准确,这需要从概率论的角度给出依据。 因此从本文起,需要花一段时间来回顾概率论的基础知识。 【2】古典概型 古典概型是我…...
省市区三级联动
引言 在网页中,经常会遇到需要用户选择地区的场景,如注册表单、地址填写等。为了提供更好的用户体验,我们可以实现一个三级联动的地区选择器,让用户依次选择省份、城市和地区。 效果展示: 只有先选择省份后才可以选择…...
阿里云服务器部署windows随手笔记(Vue+SpringBoot)
服务器管理 创建管理实例 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台 注意:需要开放端口: 点击实例ID/名称——安全组——安全组列表——管理规则—— 安全组详情——入方向——手动添加端口号(例如目的8080&…...
79,【3】BUUCTF WEB [GXYCTF2019]BabysqliV3.0
进入靶场 现在做多了其他类型,老喜欢这个页面了,老朋友admin password 老规矩,桌面有啥就传啥 第一次点击上传什么都不显示 点了两次就有下面开头的那段话了 他在最后还偷偷骂了一句 确实连不上 再回顾一下题目 buuctf打不开了 只能看别人…...
【问题】Chrome安装不受支持的扩展 解决方案
此扩展程序已停用,因为它已不再受支持 Chromium 建议您移除它。详细了解受支持的扩展程序 此扩展程序已停用,因为它已不再受支持 详情移除 解决 1. 解压扩展 2.打开manifest.json 3.修改版本 将 manifest_version 改为3及以上 {"manifest_ver…...
【AI日记】25.01.25
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛:Forecasting Sticker Sales 读书 书名:法治的细节 律己 AI:8 小时,良作息:00:30-8:30, 良短视频&…...
C语言程序设计:算法程序的灵魂
文章目录 C语言程序设计:算法程序的灵魂算法数据结构程序数据结构算法数值运算算法非数值运算算法 简单的算法举例【例2.1】求12345【例2.2】有50个学生,要求输出成绩在80分以上的学生的学号和成绩 简单的算法举例【例2.3】判定2000—2500年中的每一年是…...
jupyter配置说明
使用以下命令修改jupyter的配置文件参数: vim /root/.jupyter/jupyter_lab_config.py #这里填写远程访问的IP名,填*则默认是主机IP名 c.ServerApp.ip * # 这里的密码填写上面生成的密钥 c.ServerApp.password ************************************…...
医学图像分割 sliver07_肝脏数据集处理
医学图像分割 sliver07_肝脏数据集处理 先简单介绍一下sliver07 数据集 Sliver07 数据集 Sliver07 (Segmentation of the Liver Competition 2007) 是由 MICCAI(医学图像计算与计算机辅助干预学会)组织的经典医学图像分割数据集,主要用于肝…...