Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c++ > #81175
| From | "Alf P. Steinbach" <alf.p.steinbach@gmail.com> |
|---|---|
| Newsgroups | comp.lang.c++ |
| Subject | Re: Does static initialization of a local variable always happens synchronized ? |
| Date | 2021-09-11 17:09 +0200 |
| Organization | A noiseless patient Spider |
| Message-ID | <shigrr$vah$1@dont-email.me> (permalink) |
| References | <shhrig$7fl$1@dont-email.me> <shi50r$5vv$1@dont-email.me> <shidqb$7vq$1@dont-email.me> |
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.
But of course there can be: formal UB means that the compiler is free to
insert checking that does whatever the compiler writers want.
By the way I'm sorry for not making clear that the thread safey
guarantee stems from C++11. Instead my quoting made it seem like C++17.
Happily Paavo Helde pointed that out else-thread. :)
- Alf
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