I'm experimenting with ref, dosync, and alter to run some code in parallel, 
but so far haven't been able to figure out how to structure it such that it 
runs faster, instead of slower.

The problem looks something like this.

The current state is a long vector. Input is a long sequence of values. At 
each step some positions in the vector are populated, if empty, based on 
computations over the next value in the sequence.

It's like placing puzzle pieces: search for positions that satisfy a 
constraint, and fill them.

Using threads, I'd like to place the next several values in parallel. But 
running in parallel it's possible that two threads would find solutions 
that conflict. In this case, the latter one must continue searching.

Is there a way to express this with clojure? The problem is that I can't 
tell 'dosync' when a previous transaction invalidates the current 
transaction: it just always retries.

e.g. if each thread is doing


    (dosync
      (let [positions (find-positions next-value @state)]
       (alter state (fn [s] (update-state s positions))))))

they interfere with each other constantly, because any write to 'state' 
causes the other threads to retry, even if their positions are still free.

One really wants to reverse the order of find-positions and dosync here, so 
it computes positions, then tries to commit them, checking in the 
transaction that the positions are still free, and continuing the search if 
they're not.

I suppose there's some solution involving exceptions. Is there a better way 
to think about this?

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to