两种常用的并发模型:CSP和Actor

概述

现如今的机器大都是多核的CPU架构,为了充分利用计算机的资源,我们要了解一些并发编程的思想。

大家应该都了解传统的并发编程模式,多线程编程。
传统的多线程编程实际上是使用的ShreadMemory的方式来推动程序的前进。
为什么说new一个thread的方式是共享内存呢?
有并发的地方就有竞争,传统多线程的并发模式使用locks(锁),condition variable(条件变量)等同步原语来强制规定了进程的推进顺序,而这些同步原语本质上都是使用了在各个线程都可见的锁来实现,有一种全局变量的味道。(少数由硬件指令直接支持的除外,例如atomic_int。
那么除了直接控制thread,使用shared memory之外我们还有什么别的并发模型吗?

答案是有的~
今天我要分享的CSP和Actor模型都是基于消息传递的。(Message Passing)

CSP

CSP的是Communicating Sequential Processes (CSP)的缩写,翻译成中文是顺序通信进程,不过这个名字比较拗口,下文将用CSP来代替。
CSP的核心思想是多个线程之间通过Channel来通信(对应到golang中的chan结构),有点像是管道的概念。(Pipe)

在这里插入图片描述

Actor

Actor模式有一点类似面向对象模型,世界上所有的东西都被命名为Actor。
单个Actor会拥有一些状态,比如为名字是cat的Actor可能被描述为:

name : cat
age : 3
type : British shorthair
color : white
....

到此为止好像和对象object没有什么不同,但是Actor不会给外界提供任何的行为接口.
比如cat.Move()这是很自然的面向对象的写法,在Actor是不被允许的。
每一个Actor的属性绝不对外暴露,想和外界进行通信必须发送message,所以每个Actor自身都有一个邮箱。

在这里插入图片描述

无论是CSP还是Actor模型,他们都完完全全贯彻了一句至理名言:

Don't communicate by sharing memory; share memory by communicating. (R. Pike)

CSP :Goroutine

golang中的goroutine我们可以理解为是一个thread,但是它非常精简,调度的开销也非常小。
goroutine之间的通信使用名为chan的数据结构,对应CSP模型中的channel。
goroutine的使用很简单,仅需要关键词go即可启动一个goroutine࿰

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值