如何获得叉加入/ join_any与循环

如何获得叉加入/ join_any与循环

问题描述:

由于每SV LRM section 9.3.2如何获得叉加入/ join_any与循环

for(int j=1; j <=3; ++j) 
fork 
    automatic int k = j; 
    begin 
     .... # use k here 
    end 
join_none 

这是如何在一个循环中创建一个fork工作。我已经尝试过,它的工作原理。但是,如果我想在循环中创建join而不是join_none叉,它不会按预期工作,但会按顺序工作。

我怎么能修改此使用join工作,我想我所有的叉子叉同时关闭,然后等待他们全部完成(join)或其中之一来完成(join_any)?

谢谢

如果要等待所有由fork-jone_none fork'ed完成过程,你把wait fork;语句之后的for循环。 wait fork语句等待当前线程的所有子进程完成。

如果在这个for循环仍然活动之前有fork-jone_none创建的进程,您不想等待,那么您需要将这段代码放在隔离线程中。

fork 
    some_other_process; 
join_none 
fork 
    begin : isolation_process 
    for(int j=1; j <=3; ++j) begin : for_loop 
     fork 
     automatic int k = j; 
     begin 
      .... # use k here 
     end 
     join_none 
    end : for_loop 
    wait fork; // will not wait for some other process 
end :isolation_thread 
join 

为了得到fork-join_any的行为需要一定的握手信号或事件中的每个进程的信号,它已经完成。

event join_any_event; 
for(int j=1; j <=3; ++j) begin : for_loop 
     fork 
     automatic int k = j; 
     begin 
      .... # use k here 
      ->> join_any_event; 
     end 
     join_none 
    end : for_loop 
    @join_any_event; 

您是否需要寻找wait fork。见IEEE Std 1800-2012 § 9.6.1 等待叉声明

等待叉语句块过程的执行流程,直到所有直接子子过程(由当前进程创建的进程,但不包括他们的后代)已经完成了它们的执行。

后添加wait fork您的for循环,以获得预期的效果:

for(int j=1; j <=3; ++j) 
fork 
    automatic int k = j; 
    begin 
     .... # use k here 
    end 
join_none 

wait fork; // wait for all the above fork-join_none to complete 
+0

格雷格和我在同一时间都回答。但要小心 - “wait fork”不会等待当前进程的_all_ fork_ join_none'等待_all_ fork-join_none'子进程。这是一个非常常见的错误。看我的例子 –