Quite right that is an important distinction.

On Oct 8, 5:21 pm, Krukow <karl.kru...@gmail.com> wrote:
> On Oct 8, 3:43 am, Timothy Pratley <timothyprat...@gmail.com> wrote:
>
> > Atoms can't do this, as they are synchronous (called and returned
> > immediately) - hence the warning about potentially being called
> > multiple times.
>
> The reason that swap! may "fail" is that it is performing a compare-
> and-swap operation which may fail in a concurrent setting; the
> function passed to swap is retried if this happens.
>
> An approach that might work for you depending on your situation is to
> send to an agent which asynchronously does the swap.
>
> (def a (atom 40))
> (def queue (agent nil))
>
> (def r1 (ref 0))
> (def r2 (ref 0))
>
> (dosync
>  (let [v1 (alter r1 inc)
>        v2 (alter r2 inc)]
>    (send queue (fn [_] (swap! a #(+ v1 v2 %))))))
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to