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

C#中多线程编程中的同步、异步、串行、并行及并发及死锁

在C#中,多线程编程是一个强大的功能,它允许程序同时执行多个任务。然而,这也带来了复杂性,特别是在处理同步、异步、串行、并行、并发以及死锁等问题时。下面我将详细解释这些概念,并给出一些C#中的示例和注意事项。

目录

1. 同步(Synchronous)

2. 异步(Asynchronous)

3. 串行(Serial)

4. 并行(Parallel)

5. 并发(Concurrency)

6. 死锁(Deadlock)

结论


1. 同步(Synchronous)

在同步编程中,任务的执行顺序是线性的,即一个任务完成后,下一个任务才会开始。C#中的同步方法会阻塞调用线程,直到方法执行完成。

示例

void SynchronousMethod()
{// 执行一些操作Thread.Sleep(1000); // 模拟耗时操作Console.WriteLine("SynchronousMethod 完成");
}

2. 异步(Asynchronous)

异步编程允许任务在后台执行,而不会阻塞调用线程。在C#中,asyncawait关键字用于实现异步编程。

示例

async Task AsynchronousMethod()
{// 等待异步操作完成await Task.Delay(1000); // 模拟耗时操作Console.WriteLine("AsynchronousMethod 完成");
}

3. 串行(Serial)

串行执行意味着任务按照顺序一个接一个地执行,这在单线程程序中是自然的。

// 同步串行
void Task1()
{Console.WriteLine("Task 1 is running");
}void Task2()
{Console.WriteLine("Task 2 is running");
}Task1();
Task2();// 异步串行
async Task Task1Async()
{Console.WriteLine("Task 1 is running");await Task.Delay(1000); // 模拟异步操作
}async Task Task2Async()
{Console.WriteLine("Task 2 is running");await Task.Delay(1000); // 模拟异步操作
}async Task MainAsync()
{await Task1Async();await Task2Async();
}MainAsync().GetAwaiter().GetResult(); // 运行异步方法

4. 并行(Parallel)

并行执行允许多个任务同时执行,通常利用多核处理器的能力。在C#中,Parallel.ForParallel.ForEachParallel.Invoke等API用于并行执行。

示例

using System.Threading.Tasks;void Task1()
{Console.WriteLine("Task 1 is running");
}void Task2()
{Console.WriteLine("Task 2 is running");
}Parallel.Invoke(() => Task1(), () => Task2());
Parallel.For(0, 10, i =>
{Console.WriteLine($"并行任务 {i} 开始");Thread.Sleep(100); // 模拟耗时操作Console.WriteLine($"并行任务 {i} 完成");
});

5. 并发(Concurrency)

并发是并行和串行在更广泛意义上的结合。它指的是多个任务同时或几乎同时执行,但不一定在物理上并行(可能由于时间片轮转而在单核处理器上模拟并行)。

using System.Threading;void Task1()
{Console.WriteLine("Task 1 is running");
}void Task2()
{Console.WriteLine("Task 2 is running");
}Thread t1 = new Thread(new ThreadStart(Task1));
Thread t2 = new Thread(new ThreadStart(Task2));t1.Start();
t2.Start();t1.Join();
t2.Join();

6. 死锁(Deadlock)

死锁是多线程编程中常见的问题,当两个或多个线程相互等待对方释放资源时,就会发生死锁。这会导致这些线程永远无法继续执行。

死锁发生的四个必要条件:

互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。

请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。

不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源,P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源

避免死锁的策略

  • 确保所有线程以相同的顺序获取资源。

  • 使用锁超时机制。

  • 避免嵌套锁。

  • 使用更高级的并发控制机制,如信号量、事件或Concurrent集合。

示例(可能导致死锁):

object lock1 = new object();
object lock2 = new object();void Thread1Method()
{lock (lock1){Thread.Sleep(100); // 模拟耗时操作lock (lock2){// 执行一些操作}}
}void Thread2Method()
{lock (lock2){Thread.Sleep(100); // 模拟耗时操作lock (lock1){// 执行一些操作}}
}

在这个例子中,如果Thread1MethodThread2Method几乎同时执行,并且都尝试先锁定lock1lock2(但顺序相反),那么它们可能会相互等待对方释放锁,从而导致死锁。

结论

在C#中进行多线程编程时,需要仔细考虑同步、异步、串行、并行和并发的问题,以及如何避免死锁等并发问题。合理使用asyncawaitParallel类、锁(如lock语句)以及Concurrent集合等,可以帮助你编写高效且稳定的多线程程序。

相关文章:

C#中多线程编程中的同步、异步、串行、并行及并发及死锁

在C#中,多线程编程是一个强大的功能,它允许程序同时执行多个任务。然而,这也带来了复杂性,特别是在处理同步、异步、串行、并行、并发以及死锁等问题时。下面我将详细解释这些概念,并给出一些C#中的示例和注意事项。 …...

【Lampiao靶场渗透】

文章目录 一、IP地址获取 二、信息收集 三、破解SSH密码 四、漏洞利用 五、提权 一、IP地址获取 netdiscover -i eth0 Arp-scan -l Nmap -sP 192.168.78.0/24 靶机地址:192.168.78.177 Kali地址:192.168.78.128 二、信息收集 nmap -sV -p- 192.…...

使用WebSocket实现log日志流的实时展示-从轮询到通知

场景介绍 最近开发一个系统,其中一个模块需要展示实时的执行过程,过程日志可能比较多。以前的方案都是前端定时轮询,比如每秒查一次后端接口,将拉取回来的日志重新展示。轮询方案简单容易实现,但是比较消耗资源&#…...

UE5 从零开始制作跟随的大鹅

文章目录 二、绑定骨骼三、创建 ControlRig四、创建动画五、创建动画蓝图六、自动寻路七、生成 goose八、碰撞 和 Physics Asset缺点 # 一、下载模型 首先我们需要下载一个静态网格体,这里我们可以从 Sketchfab 中下载:Goose Low Poly - Download Free …...

O’Reilly

--江上往来人,但爱鲈鱼美。 --君看一叶舟,出没风波里。 OReilly OReilly出版社出版的技术类图书 俗称动物系列 应该是每个技术人员的必备手册。 OReilly动物系列(中译本) 简介" 动物系列作为 OReilly 书籍的典型代表被普遍…...

优盘驱动器未格式化:数据拯救行动指南

优盘困境:驱动器未格式化的挑战 在日常的数据存储与传输中,优盘以其便携性和高容量成为了我们不可或缺的伙伴。然而,当您尝试访问优盘时,突然弹出的“驱动器未被格式化”提示却如同晴天霹雳,让人措手不及。这一状况不…...

4.Handler mappings

处理程序映射 简介 在早期版本的 Spring 中,用户需要在 Web 应用程序上下文中定义一个或多个 HandlerMapping bean 以将传入的 Web 请求映射到适当的处理程序。随着注解控制器的引入,通常不再需要这样做,因为 RequestMappingHandlerMapping…...

《学会 SpringMVC 系列 · 消息转换器 MessageConverters》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...

深度学习项目 -7-使用 Python 的手写数字识别

一、前言 该文章仅作为个人学习使用 二、正文 项目源代码:深度学习项目 - 使用 Python 进行手写数字识别 - DataFlair (data-flair.training) 数据集:​​​​​​​https://drive.google.com/open?id1hJiOlxctFH3uL2yTqXU_1f6c0zLr8V_K Python 深…...

MySQL —— 库,数据类型 与 表

库与基础操作 1.1 查看数据库 使用 show databases; 可以查看当前 MySQL 目前有多少个数据库 5 rows 表示有 5 行,这里是表示的是有效的数据,不包括 第一行的指引 set 表示结果集合 0.01 sec 表示这个 sql 语句一共运行了0.01 秒,一般情况…...

Java重修笔记 第二十七天 匿名内部类

匿名内部类 1. 定义:无类名(底层自动分配类名“外部类名$1”),既是类也是对象,定义在外部类的局部位置,例如方法体和代码块中,通过new类或接口并在大括号里重写方法来实现。 2. 使用场景&…...

Nero Lens 智图 - 适用于 iOS 和 iPadOS 的专业图片处理 App

首先是手机端的无损放大 App:Nero Lens 智图,适用于 iOS 和 iPadOS,不仅可以放大,还有多种 AI 图片增强功能。 使用这款 App 可以通过 AI 模型智能放大可达 400%,还有老照片去划痕、上色,抠图移除背景、照…...

Nginx代理路径被吃

Nginx代理路径被吃的情况 日常工作中经常使用nginx反向代理一些资源,有时正常代理,发现代理不过去。 验证被吃调location情况 通过浏览器访问: https://zhao138969.com/LinuxPackage/Python/SelectDocker location /LinuxPackage { proxy…...

pytest-html报告修改与汉化

前言 Pytest框架可以使用两种测试报告,其中一种就是使用pytest-html插件生成的测试报告,但是报告中有一些信息没有什么用途或者显示的不太好看,还有一些我们想要在报告中展示的信息却没有,最近又有人问我pytest-html生成的报告&a…...

react-native从入门到实战系列教程一Swiper组件的使用及bug修复

轮播图,在app中随处可见,这么重要的功能我们怎么可能不学习下在react-native中的实现方式。 依然是第三方组件react-native-swiper 官网地址 https://www.npmjs.com/package/react-native-swiper 组件使用的组件及事件参考官方即可。 实现效果 官网…...

springboot开发的常用注解总结-配置组件类注解

Spring Boot 提供了许多注解,这些注解大大简化了 Spring 应用的配置和开发过程。以下是一些常见的 Spring Boot注解及其作用。 目录 配置组件类 (Configure Component )Configuration解释:Demo Code:更深度使用&#x…...

DataX 最新版本安装部署

1、下载 git clone gitgithub.com:alibaba/DataX.git 2、打包 mvn -U clean package assembly:assembly -Dmaven.test.skiptrue...

【架构】应用保护

这篇文章总结一下应用保护的手段。如今说到应用保护,更多的会想到阿里的sentinel,手段丰富,应用简单。sentinel的限流、降级、熔断,可以自己去试一下,sentinel主要通过配置实现功能,不难。sentinel的简介放…...

从核心到边界:六边形、洋葱与COLA架构的深度解析

文章目录 1 引言2 软件架构3 架构分类4 典型的应用架构4.1 分层架构4.2 CQRS4.3 六边形架构4.4 洋葱架构4.5 DDD 5 COLA架构设计5.1 分层设计5.2 扩展设计5.3 规范设计5.3.1 组件规范5.3.2 包规范5.3.3 命名规范 6 COLA架构总览7 小结 1 引言 软件的首要技术使命:管…...

04-Fastjson反序列化漏洞

免责声明 本文仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担&…...

ABC365(A-D)未补

A - Leap Year(模拟) 题意:给定一个数字n,如果n不是4的倍数,输出365;如果n是4的倍数但不是100的倍数,输出366;如果n是100的倍数但不是400的倍数,输出365;如果…...

Python用png生成不同尺寸的图标

Kimi生成 from PIL import Imagedef generate_icon(source_image_path, output_image_path, size):with Image.open(source_image_path) as img:# 转换图片为RGBA模式,确保有透明通道if img.mode ! RGBA:img img.convert(RGBA)# 调整图片大小到指定尺寸img img.r…...

1688中国站获得工厂档案信息 API

公共参数 名称类型必须描述keyString是免费申请调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认y…...

定时任务框架 xxl-job

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...

C/C++关键字大全

目录 一、const 二、static 三、#define 和 typedef 四、#define 和 inline 五、#define 和 const 六、new 和 malloc 七、const 和 constexpr 八、volatile 九、extern 十、前置 和后置 十一、atomic 十二、struct 和 class 一、const 1、const 关键字可用于定义…...

ROS2 Linux Mint 22 安装教程

前言: 本教程在Linux系统上使用。 一、linux安装 移动硬盘安装linux:[LinuxToGo教程]把ubuntu装进移动固态,随时随用以下是我建议安装linux mint版本的清单: 图吧工具箱:https://www.tbtool.cn/linux mint: https://…...

快速将网站从HTTP升级为HTTPS

在当今数字化的世界中,网络安全变的越来越重要,HTTPS(超文本传输安全协议)不仅能够提供加密的数据传输,还能增强用户信任度,提升搜索引擎排名,为网站带来多重益处。所以将网站从HTTP升级到HTTPS…...

Qt程序移植至Arm开发板

目录 1.工具准备: 系统调试工具SecureCRT 虚拟机安装linux(Ubuntu) 交叉编译工具链 ARM 端Qt 环境(Qt-5.7.1) 1) linux processor SD安装 2)交叉编译工具链配置 2.编译Qt工程: 2.0 交叉编译 依赖库源码,生成动…...

删除分区 全局索引 drop partition global index Statistics变化

1.不一定unusable,可以先删除data (index 再删除过程中会更新结构)再drop/truncate. ---------------------- CREATE TABLE interval_sale ( prod_id NUMBER(6) , cust_id NUMBER , time_id DATE ) PARTITION BY RANGE (time_i…...

git回退未commit、回退已commit、回退已push、合并某一次commit到另一个分支

文章目录 1、git回退未commit2、git回退已commit3、git回退已push的代码3.1 直接丢弃某一次的push3.2 撤销push后,不丢弃改动,重新修改后要再次push 4、合并某一次commit到另一个分支 整理几个工作上遇到的git问题。 1、git回退未commit git回退未comm…...

互联网站建设维护需要做什么/上海网站排名优化

问题描述: 让导航栏重叠在轮播图上面,并且导航栏要是透明的状态,功能实现了,但是出现拖到分屏宽度就变了。 代码: 开始用的宽度设置都是px单位,后来改成百分比就可以自适应了。 原因分析:…...

北京通州网站设计公司/seo外包靠谱

模块:Java 9中引入的新语言功能(类似于类,接口,包等),由一组包组成,类似于包由一组类型组成.JAR:一种归档文件格式,它捆绑代码和资源,可以由JVM加载.In order to provide reliable configuration and strong encapsulation in a way that is both approa…...

企业网站 三网系统/网站怎么制作免费的

具体生成的算法肯定不知道,但是可能明确 每个url参数的值都对应该一个地址。根据长度来看的话像是可逆的,其实不考虑他用啥散列算法了,生成这么一个字符串我想它的主要还是想统计用,如果百度搜索结果被程序抓取,那么直…...

深圳企业网站制作/关键词seo深圳

2019独角兽企业重金招聘Python工程师标准>>> node 多版本 nvm intall curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bashinstall node nvm install v8.9.4 // 国内安装 NVM_NODEJS_ORG_MIRRORhttp://npm.taobao.org/mirrors/no…...

网站架设软件/seo如何优化图片

Windows11安装oracle10g环境下载安装安装中遇到的问题环境 Windows版本: Windows11 22621.1413 oracle版本: 10g 10.2.0.1.0 下载 http://download.oracle.com/otn/nt/oracle10g/10201/10201_database_win32.zip 安装 因为之前在Windows10装过了,知道常见的几个…...

海南的房产网站建设/私人做网站建设

最近几天一直在和CVE-2019-11477 SACK panic漏洞进行纠缠,挺有意思的。 细节就不多说了,给出几个链接自己看吧: https://access.redhat.com/security/vulnerabilities/tcpsack https://github.com/Netflix/security-bulletins/blob/master/a…...