If you have tasks a, b, and c then if a takes 10, b task 2, and c takes 5 time units then the fork-join_any will exit when task b finishes (FYI a and c will still run to completion) and continue on to whatever follows the fork-join_any.
In other words the first block that finishes causes the join to occur, hence the name join_any. You can think of the Verilog fork-join as join_all
[FONT=Courier New]semaphore s;
s = new(0);
fork
begin : process1
...
s.put(1);
end
begin : process2
...
s.put(1);
end
begin : process3
...
s.put(1);
end
join_none
s.get(2);
disable fork; // kills remaining process
s = null; // removes semaphore (if you plan to reuse s)[/FONT]