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
. [
Note 1:
A conforming implementation cannot introduce
any deadlock around execution of the initializer
. Deadlocks might still be caused by the program logic;
the implementation need only avoid deadlocks
due to its own synchronization operations
. —
end note]
If control
re-enters the declaration recursively while
the variable is being initialized, the behavior is undefined
. [
Example 2:
int foo(int i) {
static int s = foo(2*i);
return i+1;
}
—
end example]