在并发编程中,我们必须考虑的问题时如何在两个线程间进行通讯。这里的通讯指的是不同的线程之间如何交换信息。

目前有两种方式:

1、共享内存

2、消息传递(actor 模型)

共享内存

共享内存这种方式比较常见,我们经常会设置一个共享变量。然后多个线程去操作同一个共享变量。从而达到线程通讯的目的。例如,我们使用多个线程去执行页面抓取任务,我们可以使用一个共享变量count来记录任务完成的数量。每当一个线程完成抓取任务,会在原来的count上执行加1操作。这样每个线程都可以通过获取这个count变量来获得当前任务的完成情况。当然必须要考虑的是共享变量的同步问题,这也共享内存容易出错的原因所在。

这种通讯模型中,不同的线程之间是没有直接联系的。都是通过共享变量这个“中间人”来进行交互。而这个“中间人”必要情况下还需被保护在临界区内(加锁或同步)。由此可见,一旦共享变量变得多起来,并且涉及到多种不同线程对象的交互,这种管理会变得非常复杂,极容易出现死锁等问题。

消息传递

消息传递方式采取的是线程之间的直接通信,不同的线程之间通过显式的发送消息来达到交互目的。消息传递最有名的方式应该是actor模型了。在这种模型下,一切都是actor,所有的actor之间的通信都必须通过传递消息才能达到。每个actor都有一个收件箱(消息队列)用来保存收到其他actor传递来的消息。actor自己也可以给自己发送消息。这才是面向对象的精髓啊!

这种模型看起来比共享内存模型要复杂。但是一旦碰到复杂业务的话,actor模型的优势就体现出来了。我们还是以刚才多线程抓取网站为例子看一下在这种模型下如何去解决。

首先我们定义一个统计actor用来统计任务完成量。然后把多个网址(消息方式)发给多个抓取actor,抓取actor处理完任务后发送消息通知统计actor任务完成,统计actor对自己保存的变量count(这个只有统计actor才能看到)加一。

最后让我们来总结一下这两种通讯模式:

并发模型 通信机制 同步机制
共享内存

线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。

同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。

消息传递(actor)

线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。

由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。

线程通信机制---共享内存:消息传递相关推荐

  1. 共享内存 传一个类指针_大神是如何学习 Go 语言之为什么使用通信来共享内存...

    为什么这么设计(Why's THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点.对具体实现造成的影响 ...

  2. 如何理解“不要通过共享内存来通信,而应该通过通信来共享内存”?

    不要通过共享内存来通信,而应该通过通信来共享内存 这是一句风靡golang社区的经典语,对于刚接触并发编程的人,该如何理解这句话? 如何理解"不要通过共享内存来通信,而应该通过通信来共享内存 ...

  3. 线程通信机制之定时器队列

    线程通信机制之定时器队列 --每周杂谈 第008篇 作者:Tocy    时间:2012-06-01 关键词:定时器队列,ITC 定时器队列(Timer Queue)可以使用CreateTimerQu ...

  4. Linux进程间的通信----->共享内存

    共享内存:         顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常安排为同一段物 ...

  5. MFC:通过代码简单理解进程间的通讯机制——共享内存

    下面用共享映射文件的方式实现进程间通信,代码可以运行. 一.浅理解 每个进程有自己独立的空间,一个进程无法访问其他进程的数据.就好像两个是互不干涉的个体,想让它们进行通信(交换数据),就必须有一段它们 ...

  6. linux 进程原理内存,linux进程通信之共享内存原理(基于linux 1.2.13)

    1 有一个全局的结构体数据,每次需要一块共享的内存时(shmget),从里面取一个结构体,记录相关的信息. struct shmid_ds { // 权限相关 struct ipc_perm shm_ ...

  7. linux进程间的通信(C): 共享内存

    一.共享内存介绍 共享内存是三个IPC(Inter-Process Communication)机制中的一个. 它允许两个不相关的进程访问同一个逻辑内存. 共享内存是在两个正在进行的进程之间传递数据的 ...

  8. Windows进程通信之共享内存通信(C++)

    首先是概念:https://baike.baidu.com/item/%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98/2182364?fr=aladdin 这是比较官方的解释 ...

  9. BREW应用间通信之共享内存

    实际上,事件传递本质上就是一种共享内存的通信方式.ICLIPBOARD可以用于实现 AEE 层中的剪切和粘贴功能,是共享内存通信的另一种重要形式.由于剪贴板数据在应用程序结束后仍可能存在,因而此函数会 ...

最新文章

  1. Java学习总结:11(final关键字)
  2. 关于Quartz的Job 不能被注入以及SpringAop对Job失效
  3. java 中pc寄存器的作用_既然有PC寄存器,栈帧里的返回地址的作用是什么?
  4. golang go mod包管理
  5. JavaScript实现更新数字指定偏移量上的值updateBit算法(附完整源码)
  6. ap协议java_AP计算机科学A:Java编程类和对象
  7. linux:使用python脚本监控某个进程是否存在(不使用crontab)
  8. React Native顶|底部导航使用小技巧
  9. linux创建根目录代码,Linux文件系统之目录的建立
  10. JS实现将所有超链接指向同一个页面地址
  11. 姚期智:量子计算只剩最后一里路;霍金:人类最好移民外太空
  12. 使用reflux进行react组件之间的通信
  13. Python Flask Web 第三课 —— 模板
  14. 企业架构:使用TOGAF进行产品开发
  15. HDFS的dfs.replication不同验证
  16. openssl漏洞补丁修复
  17. 超燃:2019 中国.NET 开发者峰会视频发布
  18. diy服务器个人主机_电脑小白如何自己动手DIY主机?
  19. 迅为4418核心板应用于智能访客机方案
  20. Secure CRT 乱码 问题

热门文章

  1. 安卓平板usb变显示器_台电千元水桶平板电脑,能办公能上网课,玩游戏比手机更爽...
  2. 1688接口 -电商代购
  3. 2018计算机全国考研学校排名,2018计算机专业学校考研难度排行榜,计算机考研难度排名...
  4. 900PHP,逼格高,造型拉风——庞巴迪Ryker 900 解析
  5. 东方博宜oj答案1051-1100
  6. 同义词词典有利于提高Tag向量匹配度
  7. 96、计算一串字符中有多少个单词
  8. ios谷歌地图显示不出来_在iOS Google Maps中显示行进方向
  9. 赛尔号服务器维护怎么玩,赛尔号新手攻略 七天让你摆脱新手成为高玩
  10. 按键精灵获取特殊文件夹路径