GCC extension for atomic access to members
Torvald Riegel
triegel@redhat.com
Mon Sep 18 20:08:00 GMT 2017
On Mon, 2017-09-18 at 14:19 +0200, Florian Weimer wrote:
> I would like to see the GCC project to document that if the address of a
> member is taken, this does not constitute an access to the object as a
> whole.
>
> That is, in the following code:
>
> #include <stdatomic.h>
>
> struct S {
> _Atomic int a;
> int b;
> };
>
> int
> load_a (struct S *p)
> {
> return atomic_load_explicit (&p->a, memory_order_relaxed);
> }
>
> int
> store_b (struct S *p, int b)
> {
> p->b = b;
> }
>
> If one thread calls load_a and another thread calls store_b on the same
> struct S *, no data race happens.
There is no data race in this example; a and b are separate objects as
far as the memory model is concerned. That's my understanding and I
believe also the understanding in the C++ committee.
> This is an extension over the C standard because of the way â->â is
> defined. C requires that E1->E2 it is evaluated as (*(E1))->E2, and *E1
> is defined as an access to the entire struct, so there is a data race in
> load_a with the assignment in store_b.
If ISO C really says that this is potentially a data race, then that's a
bug in the standard I'd say. I see no need to have an extension for
this (module there potentially being a real bug in the standard).
More information about the Gcc
mailing list