Thanks. I think the problem was I was assuming somehow I could keep track
of my individual structures by some sort of object reference, independent of
their position in the world - woolly object-oriented thinking - which was
confusing me.
If I instead have a key (or query function) that finds a structure in the
world, then I can use option (c) in my original post - I'll have a ref for
the world, then @world will be a map of key to refs to my actual structures
-
(def world (ref {}))
(defn do_something_to [key something]
(dosync
(let [struct_ref (@world key)]
(if struct_ref
(alter struct_ref something)))))
If I understand correctly, two threads calling do_something_to with
different keys won't collide, as they read @world but don't change it. I'll
get a collision if one thread changes @world and another changes an
individual structure - but I guess that's necessary, as the change might
have deleted the record with the key needed by the other thread.
I'm definitely finding this easier if I think of it in terms of storing
stuff in a database :)
- Korny
On Wed, Apr 1, 2009 at 10:58 PM, Rich Hickey <[email protected]> wrote:
>
>
>
> On Apr 1, 5:46 am, Christophe Grand <[email protected]> wrote:
> > Hello Korny,
> >
> > I share your questioning.
> >
> > On 1 avr, 06:57, Korny Sietsma <[email protected]> wrote:
> >
> > > (A) one ref for the whole world - in which case how do I stop parallel
> > > changes to two unrelated structures in the world from causing
> transaction
> > > retries?
> >
> > In this case, I wonder whether to extend "ensure" so as to be able to
> > ensure an invariant over a ref would be a good idea.
> > eg:
> >
> > (ensure world f arg1 arg2) ; compute (f @world arg1 arg2)
> > ;....
> > (commute world g arg3 arg4) ; commute iff (f @world arg1 arg2) still
> > returns the same value.
> >
>
> Interesting - I'll think about it. Off the top of my head I'm
> concerned about the use of commute - it's not really commute if you
> need to ensure that something hasn't changed. Also, there will be a
> lot of pressure on the root, and need for history, even if the
> mechanism avoids retries. You would only consider this if the need to
> see the world as a single value dominated other concerns.
>
> Until then, I recommend option C. Korny really has two things here -
> the set (please, anything but list) of identities that constitutes the
> world, and those identities themselves.
>
> Rich
>
> >
>
--
Kornelis Sietsma korny at my surname dot com
"Every jumbled pile of person has a thinking part
that wonders what the part that isn't thinking
isn't thinking of"
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---