zoukankan      html  css  js  c++  java
  • 关于并行、并发与多线程的一点理解

    问题引入

            做的一个程序中,需要从网络中获取数据然后解析后显示在界面上,然后我在没有搞清楚并行与并发的概念上就草草的搞了个线程,然后在线程里用OpenMP去做并行编程,再加上对多线程编程的不理解,造成了绕了一圈,做出来的效果和直接单线程运行程序没有差别甚至运行更慢的效果。追究根本 原因,就是我对同步、异步、并行、并发以及多线程这几个概念的模糊和想当然的理解上。

    概念区分

            同步:就是代码是完完全全按顺序跑的。假如你的一段代码中,调用了一个函数,如ReadFile,它要花费5秒钟才返回,那么你的代码就得在这个地方等待五秒。知道它完成了你才能继续往下走。

            异步:就是代码在宏观上是按顺序跑的,微观上其实不是。仍然看ReadFile这个例子,用异步方式实现的话,虽然这个函数造成的结果要花费5秒,但是在1秒内就返回了,它所做的就是提供一个地址给系统,然后返回,你就可以接着做你自己的事(这里接着要做的事暂时不与ReadFile实际读取的数据无关),由于现在大多数系统都是多任务的,那么系统在给你的这部分代码的时间片用完后就会主动去调用你刚才提供的那个地址中的代码。你在后续的处理中就会用一直方式去判断那部分代码执行完了没有,一旦发现执行完了,你就可以对这部分数据进行处理了。

            并行:不管在宏观上和微观上,我们都认为两件事情是同时在做的,那么很显然,这两件事情肯定不存在优先顺序(即谁必须先完成才能做另外一件),也不存在需要对某个东西进行同步的问题。(这里说的同步和上面解释的同步有一定的区别,上面说的同步偏向于程序的执行方式,而这里偏向于指某一部分数据不能同时被多个程序访问)。

            并发:在宏观上是两件事情同时在做,而在内部实际上是轮流执行的。那么这里就分两种情况,一种是这两件事没什么实质性的联系,你做你的事,我做我的事。另一种就是,你的先完成一点,交给我了我才能开始做,然后你就可以继续做,我也在做。这两种情况最终形成的宏观效果就是两件事情都在做。

            多线程:这里不说多线程的概念了,之所以加上它,是因为我把多线程和并发、并行给弄混淆了。多线程是并发实现的方式之一。

    友情提示: 写个博客对于我来说不容易,如果此文是我原创,烦请转载加个链接http://www.cnblogs.com/monotone/。谢谢。
  • 相关阅读:
    MyBatis 处理sql中的 大于,小于,大于等于,小于等于
    以当前日期为时间轴 计算15 天的日期 和15 天后的日期
    java 常用时间操作类,计算到期提醒,N年后,N月后的日期
    用户号已经存在是否覆盖解决办
    List<bean> 转换成List<Map>
    feig中调用其他微服务接口无反应
    从实体类中取值 ,获取修改记录信息,保存修改记录信息
    java遍历实体类的属性和值
    从数据库将数据导出到excel表格
    树同构模板
  • 原文地址:https://www.cnblogs.com/monotone/p/2770600.html
Copyright © 2011-2022 走看看