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