On Saturday, October 28, 2017 at 7:55:22 PM UTC-4, Keith Randall wrote:
>
>
>
> On Saturday, October 28, 2017 at 2:18:05 PM UTC-7, T L wrote:
>>
>>
>>
>> On Saturday, October 28, 2017 at 4:56:42 PM UTC-4, T L wrote:
>>>
>>> In my opinion, the memory model article should mention that if event A 
>>> happens event B,
>>> the the statements shown before event A in source code will be executed 
>>> before event B,
>>> and the statements shown after event A in source code will be executed 
>>> after event A.
>>> Otherwise the description
>>> "The write to a happens before the send on c, which happens before the 
>>> corresponding receive on c completes, which happens before the print. "
>>> is some abrupt.
>>>
>>
>> I think 
>>
>> If event A happens before event B, then any of the goroutines involved 
>> in the two events
>> will observe that any of the statements shown before event A in source 
>> code will be executed
>> before any of the statements shown after event B in source code. 
>>  
>> is better than 
>>
>> The write to a happens before the send on c, which happens before the 
>> corresponding receive on c completes, which happens before the print.
>>
>>
> I do like your wording.  Your description is certainly more operational 
> (directly useful to Go programmers).  I would expect a statement like that 
> in a how-to, but probably not in the spec.
> Your wording can be derived from the spec and the transitivity of 
> happens-before.
> Your description isn't sufficient though, because it doesn't describe 
> things like goroutine 1 sending on a channel to goroutine 2, when then 
> sends on a channel to goroutine 3.
> So I think you'd still need the spec description anyway. The partial 
> order, across any number of goroutines and any number of synchronization 
> operations, is the fundamental underlying abstraction.  That's why the spec 
> uses it.
>
>
yes, find a perfect wording is hard.
I often found thirdparty go articles are full of inaccurate descriptions.
Maybe, for spec, the more conservative, the better.
 

>  
>
>>
>>>
>>> On Saturday, October 28, 2017 at 1:35:37 PM UTC-4, Axel Wagner wrote:
>>>>
>>>> The thing is: The memory model *is for academics*. It is for compiler 
>>>> authors and people working on low-level primitives. As the author of a 
>>>> regular Go package or Go program, the only sentence from the memory model 
>>>> that should be of relevance to you, is
>>>>
>>>> If you must read the rest of this document to understand the behavior 
>>>>> of your program, you are being too clever.
>>>>
>>>>
>>>> which is why I quoted it several times. And you could even write a 
>>>> conforming Go implementation without needing to refer to the memory model 
>>>> at all.
>>>>
>>>> All of that being said: I am biased, because I have a Math and CS 
>>>> degree. But, personally, I don't find the notion of a partial order 
>>>> <https://en.wikipedia.org/wiki/Partially_ordered_set#Formal_definition> 
>>>> *that 
>>>> *academic or hard to understand. It should be pretty commonly 
>>>> understood by most programmers, TBQH, and the rest should be able to grasp 
>>>> it relatively quickly from a couple of examples.
>>>>
>>>> All the memory model really does, is a) define a partial order called 
>>>> "happens-before" and b) tell you how this translates into possible and 
>>>> guaranteed observed behavior. 
>>>>
>>>>
>>>> On Sat, Oct 28, 2017 at 5:11 PM, T L <tapi...@gmail.com> wrote:
>>>>
>>>>> Maybe some of my confusions come from the fact that some descriptions 
>>>>> in the Go 1 memory model article are too academic.
>>>>> And the article also doesn't cover some order guarantees in Go.
>>>>>
>>>>> On Saturday, October 28, 2017 at 10:38:19 AM UTC-4, Axel Wagner wrote:
>>>>>>
>>>>>> You are correct; I was ignoring the second edge specified later. So 
>>>>>> in some sense, for unbuffered channels, the edge is bidirectional. You 
>>>>>> still can't ignore the fact that channel operations create an edge 
>>>>>> between 
>>>>>> two and only two specific goroutines. And your initial wording is an 
>>>>>> oversimplification, because it ignores that.
>>>>>>
>>>>>> On Sat, Oct 28, 2017 at 3:26 PM, T L <tapi...@gmail.com> wrote:
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> 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...@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...@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