Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c++ > #81176
| From | Bonita Montero <Bonita.Montero@gmail.com> |
|---|---|
| Newsgroups | comp.lang.c++ |
| Subject | Re: Does static initialization of a local variable always happens synchronized ? |
| Date | 2021-09-11 17:18 +0200 |
| Organization | A noiseless patient Spider |
| Message-ID | <shihc8$2ut$1@dont-email.me> (permalink) |
| References | <shhrig$7fl$1@dont-email.me> <shi50r$5vv$1@dont-email.me> <shidqb$7vq$1@dont-email.me> <shigrr$vah$1@dont-email.me> |
Am 11.09.2021 um 17:09 schrieb Alf P. Steinbach:
> On 11 Sep 2021 16:17, Bonita Montero wrote:
>> Am 11.09.2021 um 13:47 schrieb Alf P. Steinbach:
>>> On 11 Sep 2021 11:06, Bonita Montero wrote:
>>>> Look at this code:
>>>>
>>>> #include <iostream>
>>>>
>>>> using namespace std;
>>>>
>>>> #if defined(_MSC_VER)
>>>> #define NOINLINE __declspec(noinline)
>>>> #elif defined(__GNUC__) || defined(__clang__)
>>>> #define NOINLINE __attribute((noinline))
>>>> #endif
>>>>
>>>> struct S
>>>> {
>>>> S();
>>>> };
>>>>
>>>> NOINLINE
>>>> S::S()
>>>> {
>>>> cout << "S::S()" << endl;
>>>> }
>>>>
>>>> NOINLINE
>>>> S &fn()
>>>> {
>>>> static
>>>> S s;
>>>> return s;
>>>> }
>>>>
>>>> int main()
>>>> {
>>>> fn();
>>>> fn();
>>>> }
>>>>
>>>>
>>>> I call fn twice, but of course s is initialized only once at the first
>>>> call of fn. What I asked myself if this happens synchronized, i.e. if
>>>> multiple threads try to initialize s, it's only initiailized only once
>>>> in a locked context.
>>>> With MSVC this happens as expected: before the initialization of s, fn
>>>> calls _Init_thread_header and afterwards it calls _Init_thread_footer.
>>>> These functions each call EnterCriticalSection or LeaveCriticalSection
>>>> on a global mutex. But is this behaviour guaranteed for C++ in
>>>> general ?
>>>
>>> Yes.
>>>
>>> C++ 17 §9.7/4 (next to last sentence applies):
>>> ❝Dynamic initialization of a block-scope variable with static storage
>>> duration or thread storage duration is performed the first time
>>> control passes through its declaration; such a variable is considered
>>> initialized upon the completion of its initialization. If the
>>> initialization exits by throwing an exception, the initialization is
>>> not complete, so it will be tried again the next time control enters
>>> the declaration. If control enters the declaration concurrently while
>>> the variable is being initialized, the concurrent execution shall
>>> wait for completion of the initialization. If control re-enters the
>>> declaration recursively while the variable is being initialized, the
>>> behavior is undefined.❞
>>
>> It couldn't be really undefined since the flag which remembers that
>> the object has been created successfully is set afterwards. Otherwise
>> it woud be impossible that the object will be tried to be re-created
>> if the constructor throws an exception and the function containing
>> the object will be called again. So an infinite recursion is the only
>> possible behaviour here.
>
> The standard says it's undefined behavior, hence it's undefined
> behavior. Really. So I believe that you meant to say that there
> can't be any other actual effect of this UB than infinite recursion.
There isn't any other possibility.
> But of course there can be: formal UB means that the compiler is free
> to insert checking that does whatever the compiler writers want.
I didn't refer to the flag-checking but setting the flag. This can only
be done after creating the object since the constructor can throw an
exeption. But C++ shall try to re create the object at the next call;
so this flag can only be set afterwards.
Back to comp.lang.c++ | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Does static initialization of a local variable always happens synchronized ? Bonita Montero <Bonita.Montero@gmail.com> - 2021-09-11 11:06 +0200
Re: Does static initialization of a local variable always happens synchronized ? "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2021-09-11 13:47 +0200
Re: Does static initialization of a local variable always happens synchronized ? Bonita Montero <Bonita.Montero@gmail.com> - 2021-09-11 16:17 +0200
Re: Does static initialization of a local variable always happens synchronized ? "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2021-09-11 17:09 +0200
Re: Does static initialization of a local variable always happens synchronized ? Bonita Montero <Bonita.Montero@gmail.com> - 2021-09-11 17:18 +0200
Re: Does static initialization of a local variable always happens synchronized ? David Brown <david.brown@hesbynett.no> - 2021-09-11 20:03 +0200
Re: Does static initialization of a local variable always happens synchronized ? Paavo Helde <myfirstname@osa.pri.ee> - 2021-09-11 15:13 +0300
Re: Does static initialization of a local variable always happens synchronized ? Bonita Montero <Bonita.Montero@gmail.com> - 2021-09-11 16:02 +0200
Re: Does static initialization of a local variable always happens synchronized ? Bonita Montero <Bonita.Montero@gmail.com> - 2021-09-11 21:19 +0200
Re: Does static initialization of a local variable always happens synchronized ? "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2021-09-11 22:05 +0200
Re: Does static initialization of a local variable always happens synchronized ? Bonita Montero <Bonita.Montero@gmail.com> - 2021-09-12 08:24 +0200
csiph-web