On Saturday, October 28, 2017 at 9:24:56 AM UTC-4, T L wrote:
>
>
>
> On Saturday, October 28, 2017 at 8:45:00 AM UTC-4, Axel Wagner wrote:
>>
>> No. The channel operations do not act like a fence, but like a… channel, 
>> through which happens-before relationships can be transported. The crucial 
>> point in the example you quoted is, that the channel-communication creates 
>> a happens-before relationship between the two goroutines, which then 
>> connects the happens-before relationships between channel-send/write and 
>> channel-read/print.
>>
>> Let's say, hypothetically, the happens-before relationship for 
>> channel-operations was turned around: The read happens before the send. 
>> Conceptually, they happen simultaneously and just from a local perspective, 
>> both operations would still look just as much as a "fence". But suddenly, 
>> there wouldn't be a happens-before relationship between the write and the 
>> print:
>> write ≤ channel-send ≥ channel-read ≤ print
>>
>
> There is not a constant order between the send and the receive.
> For an unbufferred channel, the guaranteed orders include:
> 1. the send must happen before the completion of the receive,
> 2. the receive must happen before the completion of the send.
> In other words, the completion of the receive and the the completion of 
> the send happen at the same time,
> they should be viewed as the same event. Both of the send and receive 
> happen before the event.
> So, at least for the two involved goroutines, the completion event must 
> act as a fence to guarantee the memory model.
>
> In theory, the completion event is able to NOT act as a fence.
> But I just doubt if it is possible from the implementation view.
>

Here, I mean "In theory, the completion event is able to NOT act as a fence 
*for 
other goroutines*. But I just doubt if it is possible from the 
implementation view."
 

>  
>
>>
>> You *have* to look at relationships between goroutines. And you need (or 
>> rather it's incredibly sensible) to take the causality-lens when 
>> understanding the memory model; it was chosen for a reason. The memory 
>> model is about establishing causal relationships between events in 
>> different goroutines and about the direction of that causality. It only 
>> makes promises about what GR A observes about GR B *if* there is an edge 
>> between them and only *if* that edge is correctly oriented.
>>
>> On Sat, Oct 28, 2017 at 1:45 PM, T L <tapi...@gmail.com> wrote:
>>
>>> The first example in the "Channel communication" section, it says
>>>
>>> The write to a happens before the send on c, which happens before the 
>>> corresponding receive on c completes, which happens before the print.
>>>
>>> From the description, I feel that "the write to a happens before the 
>>> send on c" is not caused by 
>>> "the send on c happens before the corresponding receive on c completes".
>>> And "the corresponding receive on c completes happens before the print" 
>>> is also independent to
>>> "the send on c happens before the corresponding receive on c completes".
>>>
>>> So it looks channel read and write operations really act as a fance to 
>>> avoid exchanging relative orders of statements before and after the fence.
>>>
>>> -- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "golang-nuts" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to golang-nuts...@googlegroups.com.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>

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

Reply via email to