C++ Logo

std-discussion

Advanced search

Re: Synchronization of atomic notify and wait

From: Marcin Jaczewski <marcinjaczewski86_at_[hidden]>
Date: Tue, 19 Jul 2022 21:22:24 +0200
wt., 19 lip 2022 o 13:39 <language.lawyer_at_[hidden]> napisaƂ(a):
>
> On 19/07/2022 16:28, Marcin Jaczewski wrote:
> > But for `notify` explicitly say it NEED to do in that way that `wait`
> > WILL see it correctly.
> > The Definition of `wait` on its own is not enough, you need to read
> > the whole standard and all cross references,
> > like in the case of `memcpy` that all special guarantees are placed in
> > multiple places of standard.
>
> I've re-checked the definition of notify, of wait and of "eligible to be unblocked" and still do not see how the visibility of the new value is guaranteed.
> Could you be more concrete instead of reading morals?

And how do I do anything else when you refuse to accept things that
the standard says?

Lets quote standard again:
"""
A call to an atomic waiting operation on an atomic object M is
eligible to be unblocked by a call to an atomic notifying operation on
M if there exist side effects X and Y on M such that
- the atomic waiting operation has blocked after observing the result of X,
- X precedes Y in the modification order of M, and
- Y happens before the call to the atomic notifying operation.
"""
First observation is that there is NO direct ordering between waiting
and notifying. It looks like it should work even if `notify` is
strictly BEFORE the block.
This mean we could have sequence:

Thread1 //--// Thread2
store(M, false) //--//
...
...
load(M) == false //--//
                    //--// store(M, true)
                    //--// notify(M)
block(M, false) //--//

`block` is eligible for unblocking as it fulfills every point there.
Thread1 blocked after observing the old value `false`, Thread2 changed
`M` to `true` and then called `notify`.
Nothing prevents `notify` to unlock future `block` as only the
proceeding of modification of `M` is required.
And this could be implemented by sleeping for 1s in `notify` to give
time to all `block` correctly registered.

Received on 2022-07-19 19:22:36