Re: is HB consistent with SO for not otherwise related synchronization actions?
Valentin Kovalenko via Concurrency-interest <[email protected]> Wed, 3 Feb 2021 22:40:35 -0700
| Newsgroups | gmane.comp.java.jsr.166-concurrency |
|---|---|
| Message-ID | <CAO-wXw+oqrHiec=NOhcXPDHMZCN=XGZAVZwC56QdzWm9B9HBZg@mail.gmail.com> |
Hi Alex, Exactly! This seems so obvious today but appeared subtle yesterday. ¯\_(ツ)_/¯ Regards, Valentin www.kovalenko.link On Wed, Feb 3, 2021 at 1:13 AM Alex Otenko <[email protected]> wrote: > What you are describing is the definition of the closure of po and sw > consistent with so, which is hb. > > Alex > > On Wed, 3 Feb 2021, 01:39 Valentin Kovalenko via Concurrency-interest, < > [email protected]> wrote: > >> I believe, I found how to formally prove this. >> >> Same thread. >> If hb(wx, wy) and the actions wx, wy are performed by the same thread, >> then we have so(wx, wy) trivially due to both so and hb being consistent >> with the program order (po). >> >> Different threads. >> A more interesting situation is when wx and wy are performed by different >> threads, let us label them X and Y respectively. The only way to have a >> happens-before relation between actions performed by different threads X >> and Y is to have a synchronizes-with relation between a pair of >> synchronization actions in these threads. In other words, given hb(wx, wy), >> the execution must have actions releaseX performed by X and acquireY >> performed by Y, such that synchronizes-with(releaseX, acquireY) and >> po(wx, releaseX), po(acquireY, wy). >> >> Now we can see that hb(wx, wy) necessary leads to so(wx, releaseX), >> sw(releaseX, acquireY), so(acquireY, wy); and sw(releaseX, acquireY) >> necessary means so(releaseX, acquireY). >> Therefore, hb(wx, wy) necessary leads to so(wx, releaseX), so(releaseX, >> acquireY), so(acquireY, wy), which gives so(wx, wy). >> >> I would highly appreciate it if someone could confirm this reasoning. >> >> Regards, >> Valentin www.kovalenko.link >> >> >> On Tue, Feb 2, 2021 at 5:53 PM Valentin Kovalenko < >> [email protected]> wrote: >> >>> Hi all, >>> >>> Imagine that we have only partial information about an execution (as is >>> almost always true in practice): >>> there are synchronization actions wx and wy such that happens-before(wx, >>> wy). These actions are not otherwise explicitly related, we may think of >>> them as being volatile writes to two different variables x and y. >>> >>> According to JMM, they are also ordered with the total synchronization >>> order. The order so(wx, wy) is a possibility that clearly does not violate >>> any JMM constraints. Interestingly, so(wy, wx) also does not seem to >>> violate anything, and, thus, should also be allowed. >>> >>> However, if I try to imagine a program that produces executions with >>> hb(wx, wy) and so(wy, wx) - I fail miserably. Whatever I imagine is needed >>> to have hb(wx, wy) in an execution, causes this execution to have so(wx, >>> wy). >>> >>> So maybe happens-before order is always consistent with the >>> synchronization order (if this is not the case, could someone come up with >>> a counterexample)? If this is the case, is there a way to formally deduce >>> it from JMM without resorting to the argument "I can't imagine a program >>> that produces executions with hb not being consistent with so"? >>> >>> Thank you, >>> Valentin www.kovalenko.link >>> >> _______________________________________________ >> Concurrency-interest mailing list >> [email protected] >> http://cs.oswego.edu/mailman/listinfo/concurrency-interest >> > _______________________________________________ Concurrency-interest mailing list [email protected] http://cs.oswego.edu/mailman/listinfo/concurrency-interest