Guest User

Untitled

a guest
Jun 20th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.66 KB | None | 0 0
  1. %%%
  2. %%% Циркулярный буфер
  3. %%%
  4. %%% Из родительского потока рекурсивно создаем дочерние, дочерние слушают сообщения и передают их потомкам
  5. %%% При создании последнего дочернего потока тот посылает сообщение родителю, и первый дочерний тоже начинает слушать
  6. %%% После получения сообщения, главный родительский посылает последнего дочернему сообщение с указателем на первый дочерний и заканчивает работу
  7. %%%
  8.  
  9. -module(ring_buffer).
  10. -export([start/2]).
  11.  
  12. start(N, M) ->
  13. register(parent, self()),
  14. First_Pid = spawn(fun() -> start_child(N-1) end),
  15. loop_parent(First_Pid, N, M).
  16.  
  17. start_child(0) ->
  18. parent ! {msg, self(), last_thread},
  19. loop_child(0);
  20. start_child(N) ->
  21. Pid = spawn(fun() -> start_child(N-1) end),
  22. loop_child(Pid).
  23.  
  24. loop_parent(X, K, Threshold) ->
  25. receive
  26. {msg, Pid, last_thread} ->
  27. Pid ! {msg, X, last_thread_ok},
  28. unregister(parent),
  29. Pid ! {msg, pass_me, K*Threshold - 1, Threshold},
  30. io:format("Sent message to last child~n")
  31. end.
  32.  
  33. loop_child(X) ->
  34. receive
  35. {msg, Pid, last_thread_ok} ->
  36. io:format("I'am last child, got pointer~n"),
  37. loop_child(Pid);
  38. {msg, pass_me, K, Threshold} when K > -1 ->
  39. io:format("I'am ~p, passing message to ~p, ~p left.~n", [self(), X, K]),
  40. X ! {msg, pass_me, K - 1, Threshold},
  41. if
  42. K > Threshold -> loop_child(X);
  43. true -> void
  44. end
  45. end.
Add Comment
Please, Sign In to add comment