首页 > 其他分享 >net core-异步,同步理解

net core-异步,同步理解

时间:2023-07-13 10:14:09浏览次数:39  
标签:core 并发 异步 访问 线程 访问共享 竞态 net 多线程

并发:
一个车间只有一台机器,所有的工人都需要完成相同的工作,谁先抢到这个机器谁先工作,其余人需要等待。

并行:
一个车间有4台机器,有4个工人,四个工人分别使用四台机器,同时执行任务,不用等待其它工人任务执行完毕。

单线程:
当有三件事要处理,乙 需要在 甲 之后处理,同时 丙 需要在 乙 之后,这种事件有特定的先后顺序(甲-->乙-->丙)。
多线程:
需处理的多件事互相独立。例如下载大文件时的进度条和实际下载进度,就需要一边显示进度一边进行下载。
异步编程
是并发的一种形式,老式的异步编程采用回调的机制,以避免创建不必要的线程。等操作完成时,它会调用回调函数,已让程序知道操作已经结束了。
同步编程
它和单线程的效果类似,进程之间的关系不是相互排斥,而是相互依赖的关系,
即前一个进程的输出作为后一个进程的输入。当第一个进程没有输出时第二个进程必须等待。
chatgpt的一些回复:

在多线程开发中,确实可以使用多个线程来执行相同的任务并访问相同的资源。这称为并发访问。然而,并发访问可能导致一些问题,需要谨慎处理。

竞态条件(Race Condition): 当多个线程同时访问相同的资源,并且这些线程之间存在依赖关系或操作的顺序关系时,会出现竞态条件。竞态条件可能导致不确定的行为和错误的结果。例如,多个线程同时对一个计数器进行递增操作,可能导致计数器的值不正确。

数据不一致性: 并发访问可能导致数据的不一致性。当多个线程同时读取和修改共享的数据时,由于线程之间的操作顺序不确定,可能导致读取到不正确或过期的数据。

死锁(Deadlock): 死锁是多线程并发访问中的一个常见问题。当多个线程相互等待彼此持有的资源时,会发生死锁。这将导致线程无法继续执行,程序可能会停止响应。

为了解决并发访问可能引发的问题,可以采取以下措施:

1. 同步机制: 使用同步机制来确保在任何给定时刻只有一个线程访问共享资源。常见的同步机制包括互斥锁(Mutex)、临界区(Critical Section)、信号量(Semaphore)等。这样可以避免竞态条件和数据不一致性。

2. 锁定(Locking): 使用锁定机制来保护共享资源的访问。通过在多线程访问共享资源的代码块周围使用锁定语句,只有一个线程能够进入该代码块。这种方式可以确保某个时刻只有一个线程在执行代码,从而避免竞态条件和数据不一致性。

3. 互斥量(Mutex)和信号量(Semaphore): 使用互斥量和信号量等同步原语,确保多线程之间的互斥访问共享资源。这些同步原语允许限制同时访问共享资源的线程数量,从而避免过度并发和资源争用。

4. 线程安全的集合: 如果多个线程需要同时访问集合类(如List、Dictionary等),可以使用线程安全的集合类,例如ConcurrentQueue、ConcurrentDictionary等。这些集合类提供了内置的线程安全保护机制,可以在多线程环境中安全地访问共享的集合数据。

总之,虽然可以使用多个线程来执行相同的任务并访问相同的资源,但需要注意处理并发访问可能引起的问题,如竞态条件、数据不一致性和死锁。适当地使用同步机制和锁定,或使用线程安全的数据结构,可以确保多线程访问的正确性和一致性。
private static readonly object lockObject = new object();
private int sharedData = 0;

public async Task UpdateSharedDataAsync()
{
    await Task.Delay(1000); // 模拟异步操作
    
    lock(lockObject)
    {
        sharedData++;
        // 访问共享资源
        Console.WriteLine($"Shared Data: {sharedData}");
    }
}

 

标签:core,并发,异步,访问,线程,访问共享,竞态,net,多线程
From: https://www.cnblogs.com/Insist-Y/p/17549595.html

相关文章

  • .Net8的AOT引导程序BootStrap
    前言.Net8的本地预编机器码AOT,它几乎进行了100%的自举。微软为了摆脱C++的钳制,做了很多努力。也就是代码几乎是用C#重写,包括了虚拟机,GC,内存模型等等。而需要C++做的,也就仅仅是引导程序,本篇通过代码来看下这段至关重要的引导程序的运作模式。原文:.Net8的AOT引导程序BootStrap概......
  • ubuntu20使用iptables-persistent libfakeroot libxtables-dev netfilter-persistent
    实施防火墙是保护服务器安全的重要一步。其中很大一部分是决定将对您的网络实施流量限制的单个规则和策略。像iptables这样的防火墙还允许您对应用规则的结构框架有发言权。在本指南中,您将学习如何构建防火墙,作为更复杂规则集的基础。该防火墙将主要关注提供合理的默认值和建立......
  • [LeetCode] 2542. Maximum Subsequence Score
    Youaregiventwo 0-indexed integerarrays nums1 and nums2 ofequallength n andapositiveinteger k.Youmustchoosea subsequence ofindicesfrom nums1 oflength k.Forchosenindices i0, i1,..., ik-1,your score isdefinedas:Thes......
  • 使用C#编写.NET分析器(完结)
    译者注这是在Datadog公司任职的KevinGosse大佬使用C#编写.NET分析器的系列文章之一,在国内只有很少很少的人了解和研究.NET分析器,它常被用于APM(应用性能诊断)、IDE、诊断工具中,比如Datadog的APM,VisualStudio的分析器以及Rider和Reshaper等等。之前只能使用C++编写,自从.NETNative......
  • .net 温故知新【12】:Asp.Net Core WebAPI 中的Rest风格
    RPCRPC(RemoteProcedureCall),远程过程调用),这种RPC形式的API组织形态是类和方法的形式。所以API的请求往往是一个动词用来标识接口的意思,比如https://xxxx/GetStudent?id=1和https://xxxx/AddStudent这种风格,并且往往没有规范需要我们去查看接口定义文档。HTTP方法基本只用GE......
  • 一个高性能、低内存文件上传流.Net组件
    推荐一个用于轻松实现文件上传功能的组件。项目简介一个基于.NET平台的开源项目,提供了一个简单易用的API,可以在Web应用程序中快速集成文件上传功能。优化多部分流式文件上传性能:减少25%的CPU使用量、50%内存。项目特点1、简单易用的API: 提供了简单的API,可以轻松地集......
  • 高性能网络SIG月度动态:virtio-net 支持动态中断调节,SMC v2 协议增加新扩展
    高性能网络SIG(SpecialInterestGroup):在云计算时代,软硬件高速发展,云原生、微服务等新的应用形态兴起,让更多的数据在进程之间流动,而网络则成为了这些数据流的载体,在整个云时代扮演者前所未有的重要角色。在这个万物互联的时代,云上的网络通信效率对各种服务至关重要,高性能网......
  • IIS8 安装 .net1.1
    直接上正文;一安装补丁安装顺序:1dotnetfx.exe2NDP1.1sp1-KB867460-X863NDP1.1sp1-KB886903-X86.NET_Framework_Cleanup_Tool.zip(这个是卸载.netframework的软件,后面可能会用)链接:https://pan.baidu.com/s/1ZfeZrWY-y_-UKbDkjJPPlA?pwd=a90p提取码:a90p二IIS设置1......
  • net-core(DynamicExpresso.Core)
    ==============================(Install-PackageDynamicExpresso.Core)======================================varwhereExpression=$"m.{queryField}==\"{queryValue}\"";stringwhereExpression="customer.Age>18&&......
  • netCDF文件的写出
    defnetCDF_out(tp,dims,coords,filename):tp1=[]forkey,valueintp.items():#print(key,xr.DataArray(value))tp1.append(xr.DataArray(value))tp1=xr.concat(tp1,dim='date')output_file=f"文件路径\\{f......