https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99613
--- Comment #4 from Michal Zientkiewicz <michalz at nvidia dot com> ---
The problem is that the order of destruction is incorrect if there's a race
condition.
Consider 2 threads initializing static variables S1 and S2:
Thread A Thread B
acquire
construct S1
release
acquire
construct S2
release
atexit destroy S2
atexit destroy S1
Construction order:
S1 S2
Destruction order:
S1 S2
Should be
S2 S1
The demo program triggers that behavior (not always, of course, but frequently
enough to see it fail in say, 10 runs).