如何获得叉加入/ 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
格雷格和我在同一时间都回答。但要小心 - “wait fork”不会等待当前进程的_all_ fork_ join_none'等待_all_ fork-join_none'子进程。这是一个非常常见的错误。看我的例子 –