在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1205|回复: 17

[求助] 关于fork...join内使用了wait()的疑惑

[复制链接]
发表于 2024-4-8 11:38:11 | 显示全部楼层 |阅读模式
100资产
情况是这样的:

我在foever中使用了fork语句,fork语句内使用了wait,仿真时,两个wait先后触发并执行队列操作后,退出fork_join,执行compare_transaction()函数,结果函数内语句没执行完又回到了fork..join中的wait()。结果导致事务中的数据还没做比较

fork_join.png
comp.png

最佳答案

查看完整内容

forever内是可以执行for循环的,data_compare没执行有没有可能是你的lengthdata为0呢?在你的语句里面多加几个打印,看看exp.print(),act.print()出来的啥值
发表于 2024-4-8 11:38:12 | 显示全部楼层


天蝎的尾巴i 发表于 2024-4-8 17:22
1.fork..join退出后子线程是停止的,fork-join_any是不停止的。disfork是回答另一个老哥的
2.成功信息和 ...


forever内是可以执行for循环的,data_compare没执行有没有可能是你的lengthdata为0呢?在你的语句里面多加几个打印,看看exp.print(),act.print()出来的啥值
发表于 2024-4-8 14:29:34 | 显示全部楼层
都用了fork-join为什么还要加disable fork;如果你前面的队列一直有数据,这不就是一个0延迟的死循环吗
 楼主| 发表于 2024-4-8 15:31:31 | 显示全部楼层


ICstudent 发表于 2024-4-8 14:29
都用了fork-join为什么还要加disable fork;如果你前面的队列一直有数据,这不就是一个0延迟的死循环吗 ...



感谢回答。
1.disfork是出现这个问题后加上的,不影响仿真结果
2.forever里面得有延时语句,我的想法这里wait就是时延,因为事务是一段时间发一个,队列事务不是一直存在的,有事务就会被取走因此不会有积攒事务的情况,也就是wait会有阻塞的时候,不会存在0延时。


发表于 2024-4-8 15:32:15 | 显示全部楼层
diaable fork 一般是和fork...join_any一起用的。

你要搞清楚你退出的条件是什么.
发表于 2024-4-8 15:50:28 | 显示全部楼层
本帖最后由 ICstudent 于 2024-4-8 15:53 编辑


天蝎的尾巴i 发表于 2024-4-8 15:31
感谢回答。
1.disfork是出现这个问题后加上的,不影响仿真结果
2.forever里面得有延时语句,我的想法这 ...


比对任务打印一下时间节点看一下,可以把比对任务放进fork-join内
 楼主| 发表于 2024-4-8 16:52:26 | 显示全部楼层


ICstudent 发表于 2024-4-8 15:50
比对任务打印一下时间节点看一下,可以把比对任务放进fork-join内


老哥,这是仿真设置断点的结果。

1.将比较任务放入fork内,进入compare_transaction()后还是不执行data_compare
2.将fork删去,顺序执行(因为前一个队列本身就先一步拿到事务,不影响结果),仍然会跳过data_compare
PS:
data_compare()任务内是一个for循环,用来比较两个事务中的数组
1.png
2.png
3.png
4.png
5.png
 楼主| 发表于 2024-4-8 16:56:15 | 显示全部楼层


yuanpin318 发表于 2024-4-8 15:32
diaable fork 一般是和fork...join_any一起用的。

你要搞清楚你退出的条件是什么. ...


感谢回答。

disfork是在问题出现后加上去的,为了测试问题是否出现在:退出fork后子线程还在运行
发表于 2024-4-8 17:04:58 | 显示全部楼层


天蝎的尾巴i 发表于 2024-4-8 16:56
感谢回答。

disfork是在问题出现后加上去的,为了测试问题是否出现在:退出fork后子线程还在运行


你这个fork退出后还在执行是进入到下一个循环了吧,你的比对函数是个0延迟的,所以forever过后会继续执行fork-join,而且你的函数只加比对失败的打印信息,有没有打印比对失败的信息呢?没有打印的话你加个比对成功的信息,看能不能打印出来呢?

 楼主| 发表于 2024-4-8 17:22:40 | 显示全部楼层


ICstudent 发表于 2024-4-8 17:04
你这个fork退出后还在执行是进入到下一个循环了吧,你的比对函数是个0延迟的,所以forever过后会继续执行 ...



1.fork..join退出后子线程是停止的,fork-join_any是不停止的。disfork是回答另一个老哥的
2.成功信息和失败信息都有加,但仿真压根不进入对比数据的任务data_compare(),直接跳过进入下一个forever循环了
3.目前找到了问题所在data_compare()的for循环它不执行,会直接跳过,我将for循环注了,只比较一个数据的话是可以执行,附图

总结:forever循环内嵌套for似乎不会执行for语句

6.png
7.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-18 21:15 , Processed in 0.023843 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表