On Thu, Sep 15, 2022 at 9:11 AM Thomas Bushnell BSG <tbushn...@google.com> wrote:
> I cannot speak to "other accepted concurrency designs" here. Simply that > Go does not guarantee the operation you want it to, the memory model does > not actually imply that it does, and the last sentence of the memory model > is the most important one here: don't be clever. > I believe that's what we are discussing here. The way I read it, the memory model does imply that a non-synchronized operation x sequenced before an operation y that happened before z implies that all operations sequenced after z happens after x. > > On Thu, Sep 15, 2022 at 11:08 AM robert engels <reng...@ix.netcom.com> > wrote: > >> This is not what “happens before” means - at least not in any other >> accepted concurrency designs. >> >> See my second example as to why. >> >> On Sep 15, 2022, at 10:02 AM, Thomas Bushnell BSG <tbushn...@google.com> >> wrote: >> >> Happens before works just fine with atomics. But in your example, x is >> not an atomic. >> >> Thomas >> >> On Thu, Sep 15, 2022 at 10:51 AM robert engels <reng...@ix.netcom.com> >> wrote: >> >>> Yea, the race detector is broken… it fails on the following code: >>> >>> package main >>> >>> import ( >>> "sync" >>> "sync/atomic" >>> ) >>> >>> func main() { >>> >>> var x int32 >>> var y int32 >>> >>> w := sync.WaitGroup{} >>> w.Add(2) >>> >>> go func() { >>> for { >>> x = 1 >>> atomic.StoreInt32(&y, 1) >>> } >>> w.Done() >>> }() >>> go func() { >>> for { >>> if atomic.LoadInt32(&y) == 1 { >>> if x != 1 { >>> panic("should not happen") >>> } >>> } >>> } >>> w.Done() >>> }() >>> w.Wait() >>> >>> } >>> >>> The above code does not have a race, or Go doesn’t have “happens before” >>> semantics with its atomics. >>> >>> >>> On Sep 15, 2022, at 9:41 AM, Robert Engels <reng...@ix.netcom.com> >>> wrote: >>> >>> To clarify, if the atomic read of Y sees the updated Y then a subsequent >>> non-atomic read of X must see the updated X. This is a happens before >>> relationship. >>> >>> The question was if the race detector understands this - I know - why >>> not try it out… >>> >>> On Sep 15, 2022, at 9:39 AM, Robert Engels <reng...@ix.netcom.com> >>> wrote: >>> >>> >>> I think it needs to see the updated X - which agrees with burak. >>> >>> Reading Z is race. >>> >>> On Sep 15, 2022, at 9:24 AM, burak serdar <bser...@computer.org> wrote: >>> >>> >>> >>> On Thu, Sep 15, 2022 at 8:03 AM 'Thomas Bushnell BSG' via golang-nuts < >>> golang-nuts@googlegroups.com> wrote: >>> >>>> You cannot make that assumption. It's not about what the race detector >>>> can detect. >>>> >>>> Goroutine one: >>>> Writes non-synchronized X >>>> Writes atomic Y >>>> Writes non-synchronized Z with the value of X+Y >>>> >>>> Goroutine two >>>> Reads atomic Y and sees the new value >>>> >>> >>> The way I read the Go memory model, if Goroutine two sees the new value >>> of Y, non-synchronizes writes to X by Goroutine 2 happened before Y, and >>> thus, anything that happens after Y. This is based on: >>> >>> "If a synchronizing read-like memory operation r observes a >>> synchronizing write-like memory operation w (that is, if W(r) = w), then w >>> is synchronized before r." >>> >>> And: >>> >>> "The happens before relation is defined as the transitive closure of the >>> union of the sequenced before and synchronized before relations." >>> >>> Because: >>> * The writes to non-synchronized X are sequenced before the atomic >>> write to Y >>> * The atomic read Y happened after atomic write to Y if it sees the >>> new value >>> * non-synchronized reads from X happen after that >>> >>> So that should not be a race. >>> >>> Am I reading this correctly? >>> >>> >>> >>>> >>>> Can goroutine two now read non-synchronized X and assume it sees the >>>> new value written by one? No, it cannot. There is no "happens before" >>>> relation connecting the two writes performed by goroutine one. Requirement >>>> one does not establish such a relationship. It only establishes that Z will >>>> be written with the correct sum of X and Y. There must be *some *sequential >>>> order within the context of goroutine one that sees the correct value; the >>>> compiler is free to swap the order of the writes X and Y. >>>> >>>> If X were an atomic, then Requirement two would come into play. But >>>> because X and Z are not atomic, they play no role in Requirement two. Note >>>> that the description of atomic in the model says that writes to *atomic >>>> *values have the property you want. And since there is no before >>>> relationship established by any of the following text, this synchronization >>>> cannot be relied on. >>>> >>>> Now you're asking whether the race detector ensures the synchronization >>>> property you're suggesting? The race detector doesn't ensure any >>>> synchronization properties; it detects bugs. >>>> >>>> I think it is capable of detecting this one. >>>> >>>> Thomas >>>> >>>> >>>> >>>> >>>> On Wed, Sep 14, 2022 at 11:01 PM robert engels <reng...@ix.netcom.com> >>>> wrote: >>>> >>>>> Hi, >>>>> >>>>> I am working on a new project, and the race detector is reporting a >>>>> race. >>>>> >>>>> Essentially, the code is >>>>> >>>>> var S []int >>>>> >>>>> several go routines write new S values using a mutex >>>>> >>>>> go routine Y reads S without grabbing a lock (it reads it initially >>>>> under lock) >>>>> >>>>> The semantics are such that Y can operate successfully with any valid >>>>> value of S (e.g. could be stale). (essentially S is used with copy on >>>>> write >>>>> semantics) >>>>> >>>>> The race detector reports this as a race. >>>>> >>>>> I could change all reads of Y to use an atomic load, but I don’t think >>>>> it should be necessary. >>>>> >>>>> Is there any way to perform “lazy loads” in Go? >>>>> >>>>> And a follow-up: >>>>> >>>>> Is the race detector smart enough so that if a routines write to >>>>> several vars (v1…n) and performs an atomic store to X, and another >>>>> routine >>>>> atomically reads X it can also non atomically read v1…n and it will see >>>>> the >>>>> stored values? >>>>> >>>>> This has been the long standing issue with the Go memory model and >>>>> “happens before”… but how does the race detector report this? >>>>> >>>>> (Some background, the library functions fine under heavy concurrent >>>>> stress tests - but the race detector says it is broken). >>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> 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/8EC74417-C4AD-4490-9231-6E869EE72D93%40ix.netcom.com >>>>> . >>>>> >>>> >>>> -- >>>> 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/CA%2BYjuxtd%2BpaU_BNxXDrMAN9v71r-Qhm9LcXcN2fTtjD_6oWw-Q%40mail.gmail.com >>>> <https://groups.google.com/d/msgid/golang-nuts/CA%2BYjuxtd%2BpaU_BNxXDrMAN9v71r-Qhm9LcXcN2fTtjD_6oWw-Q%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>> >>> -- >>> 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/CAMV2Rqr4vggPOWjiQg6qN0tJjhhXncKHLMCDwkqZTHBJJ7%3Dmug%40mail.gmail.com >>> <https://groups.google.com/d/msgid/golang-nuts/CAMV2Rqr4vggPOWjiQg6qN0tJjhhXncKHLMCDwkqZTHBJJ7%3Dmug%40mail.gmail.com?utm_medium=email&utm_source=footer> >>> . >>> >>> >>> -- >>> 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/93E2826E-1D85-48BE-BBD3-ED17F70C74F2%40ix.netcom.com >>> <https://groups.google.com/d/msgid/golang-nuts/93E2826E-1D85-48BE-BBD3-ED17F70C74F2%40ix.netcom.com?utm_medium=email&utm_source=footer> >>> . >>> >>> >>> >> -- 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/CAMV2RqpyR_Cw4%2B593xNzLFZmAT%3DR8JXkiabX38R2ZrFO2cXBmA%40mail.gmail.com.