发现了一点新的东西,加深了我对这几个线程的理解,写点东西记录一下。
1,并行的实际执行顺序
大家都知道fork...join里面是并行执行的,但计算机执行语句肯定是有先后顺序的,具体那些并行的语句是怎么执行的呢?
这要看具体使用的SV 仿真器是怎么操作的。虽然fork...join里面是并行的,但VCS会先执行并行的写在前面的语句。
这个program中fork...join里的两个begin...end是并行的,VCS会先执行a = b + d;然后再执行b = a + e;运行的结果如下:
将两个begin...end调换顺序后,发现就会先执行b = a + e;
结果如下
2,fork...join_none
fork...join_none块后面接的不消耗仿真时间的语句会先于fork...join_none块执行。然后注意下面这句话(这不是fork...join_none特有的,是SV这门语言仿真的执行过程):
所以对于如下的一段fork...join_none
执行的结果如下:
、
可以看到这几句话的执行先后顺序,注意有句话没有执行,因为这个initial 块已经到达了底部,所以simulation will terminate at that simulation time regardless of whether or not child threads still have future events to be executed。
3,fork...join_any
执行结果如下:
可以看下这几句语句的执行顺序,然后发现还是有句话没有执行,因为initial 块到达了底部,仿真终止了。