他のプロセスから送られてきたメッセージを誤受信しないよう制限する

刺身☆ブーメランのはてなダイアリー 2011/01/12(Wed) への返信です。
元コードの wait_server:client/3 は、receive で From を束縛しているので、この状態だとメッセージの選択受信になりません。From を Server_Pid に変更すると、ただしく動作すると思います*1
蛇足ですが、client を spawn する件と make_ref/0 を使う件に対応した添削コードを下記に掲載しておきます*2

-module(wait_server).

-export([spawn_server/0, spawn_client/3]).
-export([server/0, client/3]).
-export([test/0]).

spawn_server() ->
  spawn(wait_server, server, []).

spawn_client(Server, Time, Req) ->
  spawn(wait_server, client, [Server, Time, Req]).

server() ->
  receive
    {Client, Ref, Time, Req} ->
      timer:sleep(Time),
      Client ! {self(), Ref, Req};
    stop ->
      exit(normal);
    Unknown ->
      io:format("Server: received unknown message: ~p~n", [Unknown])
    after 60000 ->
      io:format("Server: timeout~n"),
      exit(normal)
  end,
  server().

client(Server, Time, Req) ->
  Ref = make_ref(),
  Server ! {self(), Ref, Time, Req},
  receive
    {Server, Ref, Res} ->
      io:format("Client: received ~p from ~p~n", [Res, Server]),
      {ok, Res}
    after Time + 100 ->
      io:format("Client: timeout~n"),
      {ng, timeout}
  end.

test() ->
  Data = {foo, bar, baz},
  Server = spawn_server(),
  {ok, Data} = client(Server, 100, Data),
  Client = spawn_client(Server, 100, Data),
  lists:foreach(
    fun (_) -> Client ! ignoring end,
    lists:seq(1, 10)
  ),
  timer:sleep(100),
  Server ! stop,
  ok.
1> wait_server:test().
Client: received {foo,bar,baz} from <0.33.0>
Client: received {foo,bar,baz} from <0.33.0>
ok
2> q().

*1:既に Server_Pid には値が束縛済みであるため、メッセージの選択受信となります

*2:多少、手抜きしてますが…