[erlang-questions] Executing concurrently

Joe Armstrong <>
Tue Mar 3 17:41:51 CET 2009


On Tue, Mar 3, 2009 at 3:33 PM, ryeguy <> wrote:
> He is saying that he only wants one process to be able to call his fun
> at a time. In the event that 2 processes attempt to execute the fun at
> the same time, one of them will fail while the other one works as
> normal.



Heres a fun:

      F = fun() -> 42 end.

Evaluating F() returns 42

Now spawn two processes

      P1 =  spawn(fun() -> p(F) end),
      P2 =  spawn(fun() -> p(F) end).

here's p(F)

       p(F) ->
             magic:magic(F).

 magic:magic(F) returns 42 or calls exit(ebadArg) if two processes
call magic(F) "at the same time"

 To do this you need a global process called magic, which is started
before you do any of this

  magic:start() -> register(magic, wait()).

   magic:magic(F) ->
           magic ! {eval, self(), F},
           receive
                {magic, Ret} -> Ret
           end.


   wait() ->
       receive
             {eval, Pid, F} ->
                  S = self(),
                  spawn(fun() ->
                                  Pid ! {magic, F()},
                                  Parent ! free
                              end),
                  busy()
      end.

busy() ->
      receive
            {eval, Pid, F} ->
                 exit(Pid, eNotSim),
                 busy();
             free ->
                  wait()
      end.

Or you could send a lock token and evaluate the function locally - all
of this does not seem like good
design.

The Erlang way is to create servers for global operations and send a
sequental stream of
requests to the server, where they are handled in an orderly manner
one at a time.

Cheers

/Joe




>
> On Mar 3, 7:09 am, Andras Georgy Bekes <> wrote:
>> >    I have a function Fun(). If Fun is called simultaneously by two
>> > processes, then it should fail for one process while should succeed
>> > for other. I wrote such function. Now I want to test it! How do I do
>> > that? How do I call a function exactly at same time from two
>> > different processes?
>>
>> It depends on how you define "called simultaneously".
>>
>> What do you mean "called simultaneously"?
>> What do you want to achieve?
>>
>>         Georgy
>> _______________________________________________
>> erlang-questions mailing list
>> ://www.erlang.org/mailman/listinfo/erlang-questions
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions
>



More information about the erlang-questions mailing list