如何让 fork join/join_any 与循环一起工作
How to get fork join/join_any to work with a loop
for(int j=1; j <=3; ++j)
fork
automatic int k = j;
begin
.... # use k here
end
join_none
这是在循环中创建 fork
的方法。我已经尝试过了并且有效。但是,如果我想在循环中使用 join
而不是 join_none
创建 fork,它不会按预期工作,而是按顺序工作。
我如何修改它以使用 join
工作,我希望我所有的叉子同时分叉,然后等待所有叉子完成(join
)或其中一个叉子完成完成(join_any
)?
谢谢
如果要等待 fork-jone_none
派生的所有进程完成,可以在 for 循环之后放置一个 wait fork;
语句。 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 等待分叉语句
The wait fork statement blocks process execution flow until all immediate child subprocesses (processes created by the current process, excluding their descendants) have completed their execution.
在 for 循环之后添加 wait fork
以获得所需的效果:
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
for(int j=1; j <=3; ++j)
fork
automatic int k = j;
begin
.... # use k here
end
join_none
这是在循环中创建 fork
的方法。我已经尝试过了并且有效。但是,如果我想在循环中使用 join
而不是 join_none
创建 fork,它不会按预期工作,而是按顺序工作。
我如何修改它以使用 join
工作,我希望我所有的叉子同时分叉,然后等待所有叉子完成(join
)或其中一个叉子完成完成(join_any
)?
谢谢
如果要等待 fork-jone_none
派生的所有进程完成,可以在 for 循环之后放置一个 wait fork;
语句。 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 等待分叉语句
The wait fork statement blocks process execution flow until all immediate child subprocesses (processes created by the current process, excluding their descendants) have completed their execution.
在 for 循环之后添加 wait fork
以获得所需的效果:
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