C and C++ used to be defined by an execution trace of a well formed program.
Now they are half defined by an execution trace of a program, and half a posteriori by many orderings on synchronisation objects.
Meaning that these language definitions make no sense at all as no logical method to mix these two approaches. In particular, destruction of a mutex or atomic variable is not well defined.