Thank you Alex for these precisions.

The JVM is pretty good at minimizing this stuff - so while you are stating 
> these barriers are redundant and are implying that's an issue, it would not 
> surprise me if the JVM is able to reduce or eliminate the impacts of that. 
> At the very least, it's too difficult to reason about without a real perf 
> test and numbers.
>

Fast wrong results are still wrong. I do not think it's at all obvious how 
> this affects performance without running some benchmarks. Volatiles do not 
> require flushing values to all cores or anything like that. They just 
> define constraints - the JVM is very good at optimizing these kinds of 
> things. It would not surprise me if an uncontended thread-contained 
> volatile could be very fast (for the single-threaded transducer case) or 
> that a volatile under a lock would be no worse than the lock by itself.
>

I agree that the perf argument is weak.


A transducer can assume it will be invoked by no more than one thread at a 
> time


Fine. Even simpler like this.


Transducers should ensure stateful changes guarantee visibility. That is: 
> you should not make assumptions about external memory barriers.
>

How do you enforce no more than one thread at a time without setting a 
memory barrier ?
For the JMM, no more than one thread at a time means exactly that return of 
step n will *happen-before* the call to step n+1.
This implies that what was visible to the thread performing step n will be 
visible to the thread performing the step n+1, including all memory writes 
performed during step n inside stateful transducers.
https://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html 
Still no need for extra synchronization.


You're conflating the stateful values inside the transducer with the state 
> returned by and passed into a transducer. That's a linkage that does not 
> necessarily exist.
>

What do you mean ? How could a function return a value without having 
executed its body ?


On Monday, April 10, 2017 at 9:51:30 PM UTC+2, Alexander Gunnarson wrote:
>
> Thanks for clearing all of that up Alex! Very helpful.
>
> On Monday, April 10, 2017 at 3:46:45 PM UTC-4, Alex Miller wrote:
>>
>>
>>
>> On Monday, April 10, 2017 at 2:25:48 PM UTC-5, Alexander Gunnarson wrote:
>>>
>>> I think you present a key question: what assumptions can a transducer 
>>> make? We know the standard ones, but what of memory barriers? 
>>>
>>
>> Transducers should ensure stateful changes guarantee visibility. That is: 
>> you should not make assumptions about external memory barriers.
>>  
>>
>>> Based on the current implementation, in terms of concurrency, it seems 
>>> to make (inconsistent — see also `partition-by`) guarantees that sequential 
>>> writes and reads will be consistent, no matter what thread does the reads 
>>> or writes. Concurrent writes are not supported. But *should *sequential 
>>> multi-threaded reads/writes be supported? 
>>>
>>
>> Yes. core.async channel transducers already do this.
>>  
>>
>>> This is a question best left to Alex but I think I already know the 
>>> answer based on his conversation with Rich: it's part of the contract.
>>>
>>> I think another key question is, is the channel lock memory barrier part 
>>> of the contract of a core.async channel implementation? 
>>>
>>
>> Yes, but other transducing processes may exist either in core in the 
>> future or in external libs.
>>  
>>
>>> If not, volatiles will be necessary in that context if the memory 
>>> barrier is ever taken away, and it would make sense that volatiles are used 
>>> in transducers "just in case" specifically for that use case. But if the 
>>> channel lock memory barrier *is* part of the contract and not just an 
>>> implementation detail, then I'm not certain that it's very useful at all 
>>> for transducers to provide a guarantee of safe sequential multi-threaded 
>>> reads/writes.
>>>
>>

-- 
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