[erlang-questions] Programming Erlang Exercise 8.11

igwan <>
Thu Sep 20 08:50:04 CEST 2007


Hi,

One solution would be to make the new spawned process call register/2 
before calling Fun, but in this case you would use spawn_link instead of 
spawn to cause the process calling the start function to exit when the 
name is already registered :

start(AnAtom, Fun) ->
    Fun2 = fun() -> register(AnAtom, self()), Fun() end,
    spawn_link(Fun2).

igwan

Charles Gordon a écrit :
> I'm new to Erlang and working my way through Joe Armstrong's 
> "Programming Erlang". I'm a little stumped by exercise 8.11, and I'm 
> hoping someone can give me a hint or two. Here is the full text of the 
> exercise for those of you without the book:
>
> "Write a function start(AnAtom, Fun) to register AnAtom as spawn(Fun). 
> Make sure your program works correctly in the case when two parallel 
> processes simultaneously evaluate start/2. In this case, you must 
> guarantee that one of these processes succeeds and the other fails."
>
> I think I understand the problem to mean that start(AnAtom, Fun) 
> should spawn(Fun) and then register the resulting Pid with AnAtom. 
> Here is my best shot at such a function:
>
>  start(AnAtom, Fun) ->
>      case whereis(AnAtom) of
>          undefined ->
>              Pid = spawn(Fun),
>              register(AnAtom, Pid);
>          true ->
>              true
>      end.
>
> The problem didn't specify what the function should return after the 
> first call, so I'm just returning "true" (since that is what 
> "register/2" returns). The trouble I'm having is that I can't see how 
> this avoids a race condition. I don't understand what underlying 
> mechanisms ensure that two parallel processes calling this function 
> don't both evaluate "whereis(AnAtom)", both get "undefined" and both 
> spawn the process (and register it). The problem here is that whereis 
> and register seem to be accessing some sort of shared global state, 
> which is supposed to be impossible. At least, I think they are, since 
> I can't understand how else they would work. What am I missing here?
>
> Thanks!
> Charles Gordon
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions




More information about the erlang-questions mailing list