三分钟掌握共享内存 & Actor并发模型

鸿蒙Next多线程并发场景下安全访问共享内存实现方案 本文介绍了鸿蒙HarmonyOSNext开发环境中的共享内存安全访问方案。通过SharedArrayBuffer实现多线程内存共享,结合Atomics原子操作确保数据一致性,并基于Actor模型提供锁机制保障线程安全。文档详细说明了共享内存创建、原子操作API使用、锁实现方法及完整示例代码,同时给出了性能优化建议。该方案在保持线程隔离安全性的同时,为高频数据交换场景提供了高效解决方案,帮助开发者充分利用多核处理器提升应用性能。 阅读详情

共享内存

面向对象编程中,万物都是对象,数据+行为=对象;
多核时代,可并行多个线程,但是受限于资源对象,线程之间存在对共享内存的抢占/等待,实质是多线程调用对象的行为方法,这涉及#线程安全#线程同步#。

假如现在有一个任务,找100000以内的素数的个数,如果用共享内存的方法,代码如下:

可以看到,这些线程共享了sum变量,对sum做sum++操作时必须上锁。

using System;
using System.Threading.Tasks;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using System.Diagnostics;

/// <summary>
/// 利用并行编程库Parallel,计算10000内素数的个数
/// </summary>
namespace Paralleler
{
    class Program
    {
        static object syncObj = new object();
        static void Main(string[] args)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            ShareMemory();
            sw.Stop();
            Console.WriteLine($"共享内存并发模型耗时:{sw.Elapsed}");
        }

        static void ShareMemory()
        {
            var sum = 0;
            Parallel.For(1, 100000 + 1,(x, state) =>
            {
                var f = true;
                if (x == 1)
                    f = false;
                for (int i = 2; i <= x / 2; i++)
                {
                    if (x % i == 0)  // 被[2,x/2]任一数字整除,就不是质数
                        f = false;
                }
                if(f== true)
                {
                    lock(syncObj)
                    {
                        sum++;   // 共享了sum对象,“++”就是调用sum对象的成员方法
                    }
                }
            });
            Console.WriteLine($"1-10000内质数的个数是{sum}");
        }
    }
}

共享内存更贴合"面向对象开发者的固定思维", 强调线程对于资源的掌控力。

Actor模型

Actor模型则认为一切皆是Actor,Actor模型内部的状态由自己的行为维护,外部线程不能直接调对象的行为,必须通过消息才能激发行为,也就是消息传递机制来代替共享内存模型对成员方法的调用, 这样保证Actor内部数据只能被自己修改, Actor模型= 数据+行为+消息。

还是找到10000内的素数,我们使用.NET TPL Dataflow来完成,代码如下:

每个Actor的产出物就是流转到下一个Actor的消息。

using System;
using System.Threading.Tasks;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks.Dataflow;
using System.Diagnostics;

/// <summary>
/// 利用并行编程库Paralleler,计算10000内素数的个数
/// </summary>
namespace Paralleler
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Actor();
            sw.Stop();
            Console.WriteLine($"Actor并发模型耗时:{sw.Elapsed}");  
        }

        static void Actor()
        {
            var linkOptions = new DataflowLinkOptions { PropagateCompletion = true };
            var bufferBlock = new BufferBlock<int>();
            var transfromBlock = new TransformBlock<int,bool>(x=> 
            {
                var f = true;
                if (x == 1)
                    f = false;
                for (int i = 2; i <= x / 2; i++)
                {
                    if (x % i == 0)  // 被[2,x/2]任一数字整除,就不是质数
                        f = false;
                }
                return f;
            }, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism =50 });

            var sum = 0;
            var actionBlock = new ActionBlock<bool>(x=>
            {
                if (x == true)
                    sum++;
            },new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 50 });
            transfromBlock.LinkTo(actionBlock, linkOptions);
            // 准备从pipeline头部开始投递
            for (int i = 1; i <= 100000; i++)
            {
                transfromBlock.Post(i);
            }
            transfromBlock.Complete();  // 通知头部,不再投递了; 会将信息传递到下游。
            actionBlock.Completion.Wait();  // 等待尾部执行完成
            Console.WriteLine($"1-10000内质数的个数是{sum}");
        }
    }
}

Actor并发模型强调的是消息触发。

还不过瘾

共享内存模型: 其实是并行线程调用对象的成员方法,这里不可避免存在加锁/解锁, 需要开发者自行关注线程同步、线程安全。

Actor模型:以流水线管道的形式,各Actor独立处理各自专属业务,等待消息流入,我也很容易推断,每个Actor的实现过程:存在循环,不断处理新流入的消息。

 var queue= new Queue(1000); 
 for{
    if(queue.Dequeue() != null) {
       // Done bussiness 
    }
    Thread.Sleep(50ms);
 }

所以Actor模型,开发者不用关注线程锁,同时,Actor模型解耦了调用关系,天然适合分布式场景。

总结陈词

  1. 何为“并发模型”,模型是达成某个方案的编程风格,共享内存/Actor并发模型说不上孰优孰劣,适用场景有偏向。
  2. 共享内存并发模型,更强调多线程对于资源的掌控力。
  3. 从概念上得知,Actor模型强调消息触发,更适合分布式场景,解耦了调用方和提供方(我这里演示的TPL Dataflow是进程内Actor模型)。
  4. Golang使用的Channel是类Actor模型,使用Channel进一步解耦了调用的参与方,你都不用关注下游提供者是谁。

作为一名编程老兵,深知大家平时常用的是共享内存并发模型,开口闭口“多线程”,“锁”,
可能很多人并没有关注到Actor模型,微软进程内Actor TPL Dataflow香气侧漏,值得推荐。

多对比、多体验不同的编程风格,别有洞天。

UnrealSharp实战指南:UE5中C#热重载与蓝图互通开发 在虚幻引擎5(UE5)开发中,C#语言正逐步成为业务逻辑层的关键选择。其核心价值在于弥补C++编译周期长与Blueprint可维护性差之间的鸿沟,依托UE反射系统实现原生级集成。通过热重载机制,开发者可秒级验证逻辑变更;借助UProperty、UFunction等特性,C#类能无缝暴露属性与函数至蓝图编辑器,达成真正的蓝图互通。这种能力显著提升原型迭代效率、策划协作深度与组件化复用水平,适用于玩法验证、UI交互、AI行为树等高频业务场景。UnrealSharp正是当前唯一支持编辑器内右键创建C# Actor 阅读详情

相关推荐

Linux内核本质:操作系统的心脏与硬件资源总控中心

内核是操作系统最核心的特权级程序,运行于CPU Ring 0,为上层应用提供进程管理、内存虚拟化、文件系统抽象和设备驱动四大支柱能力。其设计基于特权级隔离(如系统调用)、硬件抽象层(HAL)和安全仲裁机制,确保多任务并发下的稳定性与安全性。理解内核即理解为什么程序不能直接操作物理内存、为何进程崩溃不致系统瘫痪、以及‘kernel panic’和‘unable to find the kernel source tree’等典型问题的技术根源。它既是硬件资源的中央银行,也是软件生态得以统一运行的底层契约。

culuo8053的博客 539

三分钟掌握Actor和CSP模型

点击上方蓝字进行关注前文传送门:《三分钟掌握共享内存模型和 Actor模型》, 一直想比较Actor模型与golang的CSP模型,经过一段时间的实战记录了本文。ActorvsCSP模型•传统多线程的的共享内存(ShareMemory)模型使用lock,condition等同步原语来强行规定进程的执行顺序。•Actor模型,是基于消息传递的并发模型, 强调的是...

qq_30236895的博客 1805

GNN驱动的数据增强与开源分布式落地实践

图神经网络(GNN)作为处理关系型数据的核心技术,其工程化落地长期受限于图数据稀缺、结构敏感和部署复杂三大瓶颈。传统数据增强方法在图上失效,因其破坏拓扑连通性、违背物理约束或丢失长程依赖;而分布式部署又面临邻居采样性能、跨机通信开销与实时推理状态管理等挑战。GNN驱动的数据增强通过结构增强(如基于嵌入的边概率生成)与特征增强(如VAE+GNN流形建模)协同提升泛化能力;结合PyTorch Geometric高效采样、Kubeflow流水线编排与KServe服务化,构建可审计、可观测、可伸缩的开源技术栈。本文

weixin_34099526的博客 513

用Java实现Actor模型(模仿Skynet)

Actor模型是一种常见的并发模型,与最常见的并发模型——共享内存(同步锁)不同,它将程序分为许多独立的计算单元——Actor,每个Actor独立管理自己的资源,不同Actor之间通过消息传递来交互。它的好处是全异步执行,不会造成线程阻塞,从而提升CPU使用率,另外由于线程之间是异步交互,所以也不用考虑加锁和线程同步的问题。Actor模型在业界有许多应用,例如游戏服务器框架Skynet、编程语言Erlang。因为历史原因,Java下的Actor模型应用较少,知名的只有基于Scala的Akka。

长三月的游戏开发 2133

企业级爬虫终极方案:百万级代理池与全维度风控绕过实战

网络爬虫作为数据采集的核心技术,其核心原理在于模拟客户端向服务器发起请求并解析响应。随着反爬虫技术的演进,传统基于简单伪装和轮换IP的策略已难以应对现代风控体系。其技术价值在于构建一个稳定、高效、智能的数据采集基础设施,以支撑市场监控、舆情分析等企业级应用场景。这要求系统具备资源调度、行为模拟和智能决策能力,尤其需要应对IP封锁、行为指纹检测等立体风控。本文聚焦的百万级分布式代理池正是解决IP资源管理的核心组件,它通过微服务架构实现IP的采集、验证、调度与监控,确保高可用与负载均衡。同时,全维度风控绕过策略

weixin_34129696的博客 297

并发机制:CSP vs Actor模型以及Golang实现

CSP &amp; Actor Model 本文将简单介绍CSP和Actor模型俩流行的并发机制,并比较他们的优缺点,并通过Golang中CSP并发机制实现FutureTask.并行机制有很多像是多线程,CSP,Actor等等.拿多线程来说,就有诸多问题,譬如:死锁,可扩展性差,共享状态.就像共享状态会产生很多问题,它涉及到内存的变化。只有一个进程发生变化没问题。但如果有多个进程共享和修改相同的数据,这将非常糟糕.为解决这些问题,提出了很多解决方法呢.比如,CSP和ActorModel. 如下是一些编程语言,以及它们相应的并发机制: Actors Model &mdash; Erlang, Scala, Rust

golang并发编程模型之actor(一)

golang并发编程模型之actor 及 mpsc 异步投送消息及同步等待回复

yunteng521的博客 1097

Keil 丢失编译器版本5、内核文件core_cm3.c报错

若用的是旧版本的core_cm3.c ,就使用编译器v5编译工程;若想用编译器v6,就更新4个相关的内核文件:(CMSIS:Cortex Microcontroller Software Interface Standard,ARM Cortex™ 微控制器软件接口标准)

qq_52804040的博客 6245

java actor模型和消息传递实现分析

Actor模型是一种基于协程的消息传递模型,在并行计算和并发的消息传递中有很好的性能表现。一般的actor模块框架提供了超轻量级的线程和工具,可以在这些线程之间进行快速、安全、零复制的消息传递。在elang,ruby,lua等语言中都是直接在VM级别支持协程,VM帮你做context的保存和恢复。而在java中,却没有内置actor模型实现,但是有几个开源框架也模拟了actor模型的实现。   ...

我的技术旅程 611

保姆级教程:用YOLOv5s训练PCB缺陷检测模型(附北大公开数据集)

本文提供了一份基于YOLOv5s的PCB缺陷检测模型从零开始的完整实战教程。详细解析了如何使用北大公开数据集,涵盖环境搭建、数据处理、模型训练、性能评估及优化部署全流程,并针对工业场景中常见的类别不均衡问题给出了具体解决方案,旨在帮助开发者快速构建高精度的自动化质检系统。

weixin_28285943的博客 308

GAN模型中的常见变体有哪些,如DCGAN、WGAN和CGAN等?

生成对抗网络(GAN)是一种强大的深度学习模型,它由生成器和判别器两个网络组成,通过对抗训练的方式实现生成数据的能力。随着研究的发展,出现了许多GAN的变体,每个变体都有其独特的改进和特点。

huidhsu的博客 2262

共享内存 & Actor并发模型到底哪个快?

HI,前几天被.NET圈纪检委@懒得勤快问到共享内存和Actor并发模型哪个速度更快。前文传送门:《三分钟掌握共享内存 &amp; Actor并发模型》说实在,我内心10w头羊驼跑过......

dotNET跨平台 362

Label Studio保姆级教程:从零搭建医疗影像标注平台(DICOM格式支持)

本文提供基于Label Studio从零搭建医疗影像标注平台的保姆级教程。针对DICOM格式支持,详细阐述了环境部署、DICOM深度集成与预处理、团队协作权限管理以及质量审核闭环等核心环节,旨在构建一个高效、可落地的医疗AI数据标注解决方案,助力模型落地。

nft7creator的博客 305

C# 高并发场景下 共享内存 & Actor并发模型到底哪个快?

HI,前几天被.NET圈纪检委@懒得勤快问到共享内存和Actor并发模型哪个速度更快。前文传送门:《三分钟掌握共享内存 &amp; Actor并发模型》说实在,我内心10w头羊驼跑过......

farway000的博客 490

保姆级教程:在LKD3588开发板上为RK3588添加SC2210摄像头驱动(含完整DTS配置)

本文提供了一份详细的教程,指导如何在LKD3588开发板上为RK3588处理器添加SC2210摄像头驱动,包括完整的DTS配置和内核编译步骤。教程涵盖了环境准备、驱动文件添加、DTS配置详解、内核编译与烧录、驱动测试以及常见问题排查,帮助开发者快速实现SC2210传感器在RK3588平台上的集成与优化。

weixin_42641741的博客 480

利用WI生成无线信道数据

选取DeepMIMO的一个射线追踪场景O1(Outdoor 1)Scenario,工作频率为3.5GHz。有两条街和一个十字路口的户外场景18个基站和超过一百万个用户18个基站(BSs):BS1-BS18.每个基站的高度是8米每个基站的天线阵列是isotropic天线三个统一的x-y用户网格用户的总计数量为:1184923每个用户网格中的第一个用户总是(x,y)坐标最低的用户 所有用户的高度是2m每个用户的每个天线阵列是isotropic天线定义射频追踪场景。

bingbingaidaima的博客 5609

CARLA中文文档标准:面向工程落地的技术确定性规范

在自动驾驶仿真领域,CARLA作为主流开源城市驾驶模拟器,其Python API的稳定性与可复现性直接决定算法验证效率。理解CARLA核心机制(如World同步、Tick语义、传感器坐标系)是规避‘幽灵Bug’的前提;而技术文档的本质价值,在于将C++/Python双栈行为、版本演进约束、环境适配细节等隐性知识显性化。本标准聚焦CARLA中文生态长期存在的版本错位、执行断点、术语混乱与跨层失焦四大痛点,以‘可验证、可追溯、可协作’为准则,构建覆盖部署、API、数据流与同步机制的全链路文档规范,支撑高校实验复

davy57345的博客 352

高频功率放大器的设计实现

摘 要 随着无线通信技术的高速发展,市场对射频电路的需求越来越大,同时对射频电路的性能要求也越来越高。高频功率放大器是位于无线发射级末端的重要部件,为了弥补信号在无线传输过程中的衰耗,要求发射机具有较大功率的输出,通信距离越远,要求的输出功率越大。在高频范围内,为了获得足够大的高频输出功率,就要采用高频功率放大器。 本次课程设计的高频功率放大器的技术指标包括输出功率、效率、功率增益、由于高频频功率放大器的输出功率比较大,耗能比较多,所以工作效率就显得比较重要。本课程设计的高频功率放大器电路由两极功率放大器

qq_43543515的博客 3万+

【go语言】CSP并发机制与Actor模型

多线程共享内存模型是一种并发编程模型,其中多个线程在同一个进程的地址空间中。这种模型允许多个线程相同的数据结构,但也引入了一些潜在的问题,其中最常见的问题之一就是竞态条件(Race Condition)。竞态条件(Race Condition)是多线程或多进程并发执行时,由于而导致程序的依赖于执行序列的结果的情况。这意味着多个线程或进程在访问和修改共享数据时,如果没有适当的同步机制,可能导致意外的结果。竞态条件的经典示例是两个线程同时对共享变量进行读取-修改-写入操作。

Candy___i的博客 2285

仿真系列专栏介绍

大家好!欢迎来到我的仿真学习系列专栏!这是一个我在学习仿真技术过程中整理和分享的系列文章。作为一名正在不断学习和实践的工程师,我希望通过这个专栏,和大家一起探索仿真技术,尤其是在高速信号完整性方面的应用。

案例文章,高速信号 368

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Golang的并发安全

Golang的并发安全 1、通道channel(CAP模型) channel是Go中代替共享内存的通信方式,channel从底层实现上是一种队列,在使用的时候需要通道的发送方和接收方需要知道数据类型和具体通道。如果有一端没有准备好或消息没有被处理会阻塞当前端。 Actor模型和CAP模型 Actor模型:在Actor模型中,主角是Actor,类似一种worker,Actor彼此之间直接发送消息,不...

alvin_666的博客 8128

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: Redis中一个String类型引发的惨案
下一篇: JSON 字符串是如何被解析的?JsonParser 了解一下
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值