Hi,
I just want to address this issue (CLJ-1498
<http://dev.clojure.org/jira/browse/CLJ-1498>). It was accepted in
1.7-alpha2 and I haven't seen a lot of discussion around it, even though
it's quite a big change.
With this change the following code is possible:
(let [m (transient {:a 0})
futs (for [n (range 100)]
(future (assoc! m :a (inc (:a m)))))]
(mapv deref futs) ; wait until futures are done
(persistent! m))
The results will vary per run, where it used to throw
an IllegalAccessError: "Transient used by non-owner thread".
I understand the problems of not being able to have 1 go routine access a
transient, even though it would be safe, but this solution feels like it's
throwing out the baby with the bathwater. Basically, it's doing away with
what the following block on clojure.org <http://clojure.org/transients>
says:
*Transients enforce thread isolation**.* Because each result of a transient
> operation shares (mutable) structure with the previous, it would be very
> dangerous if more than one thread were to manipulate a transient at once.
> In order to prevent this, transients will detect any (read or write) use
> from a thread other than the one that created them and throw an exception.
>
> This may not sound like a concurrency story, but single-thread isolation
> is actually a very useful concurrency semantic. The whole point of using
> transients is that doing so is safe, because their use is an isolated
> implementation detail of otherwise functional code. Having that be enforced
> means that some things that would normally be very hard to make safe with
> ordinary mutable data structures become easy.
I don't have a good solution for dealing with transients and logical
threads, but I would much prefer keeping the semantics of transients as
they are and maybe pass an option to transient to disable owner checking.
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
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
---
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 [email protected].
For more options, visit https://groups.google.com/d/optout.