| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> fork join和for循环结合的实际应用 -> 正文阅读 |
|
[Java知识库]fork join和for循环结合的实际应用 |
fork
…join
结构中,父进程会被阻塞直到所有的子进程结束;
fork...join_any
结构中,父进程会被阻塞直到其中任意一个子进程结束;
fork....
join_none
父进程会立即与产生的所有进程并发执行。
fork中每条语句并行执行
,如果将多个语句封装在一个 begin
…end
块中会将整个块
作为单个进程执行,其中每条语句顺序地执行。
实际应用:
实际应用中,我们通常会使用了for循环和fork join_none来并行启动多个进程(这样不用写哪些重复的代码)。
for+fork...join
首先说明使用for+fork...join是
不能实现并行启动多个进程,因为fork...join是会阻塞父进程的,外部的for循环是主程序一部分,所以fork...join也会阻塞for循环的进行。如下代码的结果·中,从打印的时间,看三次for循环并没有并行(即使使用automatic也一样的,这是fork...join阻塞父进程决定的):
结果:
for+fork...join_none fork...join_none则不会阻塞父进程,因此使用for+fork...join_none才能实现并行启动多个进程。当我们将上面代码改为fork...join_none: 代码:
结果:
可以看到打印的三个时间是一样的了说明是并行,但是a的值是一样的,这是因为SV中function和task默认都是静态的,这些静态的function和task里面的局部变量会使用共享的静态存储区,所以不同的线程之间会窜用这些变量,可以在unction和task加入automatic改做动态的,此外还需要一个动态变量来接收for循环的j,不然结果依然,这是因为并行启动时j已经等于3了,此时各个进程会共用一个j。改变后代码如下:
结果:
但是上面结果有另外一个问题,如果for循环后面display这个语句执行是和整个循环并行的(打印的time是0),因为fork...join_none并没有阻塞父进程。如果for后面代码依赖for循环内的并行进程时,我们就希望在for内所有进程都执行完再执行for后面的父进程。此时,我们就需要加上一个隔离进程。 for+fork...join_none+fork..join 因为fork...join可以阻塞父进程,所以我们可以在for外面在套一个fork...join作为隔离,此外我们需要使用wait fork来等待子进程执行完成。如下结果中我们可以看到display的打印已经在time=1。说明for后面主进程是在并行进程执行完之后执行的。 代码:
结果:
在实际代码中,我们可能需要同时送不同的item给不同的sequencer,而这不同的item之间又需要同步发送,那么就需要使用这样的组合。比如下面代码:
注意px_tr_img一定不能申明为队列,因为是并行,而队列中如果前一个元素没有创建,后一个元素是不能创建的,所以px_tr_img只能是定数组或动态数组。(提醒自己) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 9:05:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |