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
语句等待当前线程的所有子进程完成。
在此fork-jone_none
循环仍处于活动状态之前,for
创建了一些进程,您不想等待,您需要将这段代码放在隔离线程中。
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等待fork语句
wait fork语句阻止进程执行流,直到所有直接子子进程(当前进程创建的进程,不包括其后代)完成执行。
在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