Доброго времени, смотрю презентацию Erlang Programming for Multi-core Ulf Wiger,
там он приводит пример pmap который при возникновении ошибки должен прекратить работу и остановить работу порожденных потоков
-module(test_pmap).
-export([pmap2/2]).
spawn_jobs2(F, L) ->
Parent = self(),
[spawn(fun(X1) -> Parent ! {self(),catch {ok,F(X1)}} end) || _X <- L].
pmap2(F, L) -> await2(spawn_jobs2(F, L)).
await2([H|T]) ->
receive
{H, {ok, Res}} -> [Res | await2(T)];
{H, {'EXIT',_} = Err} ->
[exit(Pid,kill) || Pid <- T],% тут посылаем всем приказ умереть
[receive {P,_} -> d_ after 0 -> i_ end || P <- T], %как я понял здесь ждем подтверждения об окончании работы,
%смысл этого, плюс совершенно не понятен синтаксис, что за d_ и i_
erlang:error(Err)
end;
await2([]) -> [].
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>