On Tue, Nov 12, 2019 at 10:21 AM Marvin Renich <m...@renich.org> wrote:
>
> There are two different viewpoints you can take.  Either the Go Memory
> Model must stand alone, and any concurrency claims made by the language
> and standard library must be based on the limited set of operations
> defined in the GMM, or the GMM provides the definitions and provides a
> substantial, but not complete, list of operations satisfying that
> definition, and a standard library package (or language feature) may
> claim to satisfy the GMM definitions by some unspecified internal means.
>
> If you accept the second, than I believe the documentation of the
> sync/atomic package is enough to allow atomic operations to be used to
> establish a happens-before relationship.

Is there a guarantee that the compiler will not reorganize
instructions around an atomic read/write? That is:

i++
k:=atomic.AddInt32(&j,1)

Is there a guarantee that the compiler won't rewrite this as:

k:=atomic.AddInt32(&j,1)
i++

>
> * burak serdar <bser...@computer.org> [191111 21:03]:
> > You cannot define a "happens-before" relationship using only atomics
>   ^ Accepting the atomic documentation, I disagree with this.
> > with the current memory model. The happens-before relationship, the
>                                  ^ Either way, I completely disagree
>                                    with this.
> > way it is written, relies on one goroutine blocking until the other
> > comes to a point where "things happen" before the block is released.
> > There is no blocking with atomics, hence there is no point in time
>   ^ I (sort of) agree with this,     ^ but not this.
>
> Sort of, because any blocking that occurs takes place at the hardware
> level (CPU and memory controller working out any cache and memory bus
> contention).
>
> > where one goroutine can be sure of things happened in the other
> > goroutine.
> >
> > The only guarantee with atomics is that when one goroutine reads a
> > value, it will read the last written value. There are no guarantees on
> > other values. According to the mm, things that happened before that
> > final write may not be observable to other goroutines.
>
> The memory model is not defined in terms of blocking; in fact the only
> mention of blocking is in the explanatory, non-normative text for
> sync.Once.  Blocking is a consequence of some operations in order to
> obey the memory model; it is not the cause.
>
> The memory model is defined in terms of happens-before relationships,
> and says that certain operations create such a relationship.
>
> My claim is that the GMM gives exactly three mutually exclusive choices:
>
>   Also, if e1 does not happen before e2 and does not happen after e2,
>   then we say that e1 and e2 happen concurrently.
>
> There is no fourth choice, so if e1 and e2 do not happen concurrently,
> then they have one of the happens-before relationships.
>
> Most of the synchronization operations (e.g. channel reads and writes)
> define that a happens-before relationship exists in a specific
> direction.
>
> The atomic package is different in that it specifies that two atomic
> operations to the same memory location do not happen concurrently.  By
> logical inference, rather than explicit statement, there must be a
> happens-before relationship, but the direction of that relationship is
> not specified.  You must use "pure logic" (in the mathematical sense),
> if possible, to determine the direction.
>
> I would be perfectly happy to have the memory model specify:
>
>   If an atomic read r [in one goroutine] can be proven to have observed
>   a specific atomic write w [from another goroutine], than the w
>   happens-before the r.
>
> I like this even better:
>
>   Two atomic operations to the same variable v do not happen
>   concurrently, and thus a happens-before relationship exists between
>   them in an unspecified direction.  Sometimes logic may be used to
>   prove the direction of the relationship.
>
> If you adhere to the first viewpoint at the top of this message, than I
> would say something like the above would be a mandatory addition to the
> GMM document.  However, I am perfectly happy with the viewpoint that the
> GMM provides the definitions, and the list of operations satisfying
> those definitions can be specified in the Language Specification and the
> standard library documentation.
>
> ...Marvin
>
> --
> 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.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/20191112172034.nkhmoaqjjrawc7wx%40basil.wdw.

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAMV2RqoJgHrPc-FaumbK1iUzA0Eg3dCz%3DXyk-Mvs2v3iO%3DTrXg%40mail.gmail.com.

Reply via email to