This patch attempts to fix the last 3 TSAN failures on the libc++ bot (http://lab.llvm.org:8011/builders/libcxx-libcxxabi-x86_64-linux-ubuntu-tsan/builds/143). This patch also adds a Atomic test type that can be used where <atomic> cannot.
wait.exception.pass.cpp and wait_for.exception.pass.cpp were failing because the test replaced std::terminate with std::exit. std::exit would asynchronously run the TLS and static destructors and this would cause a race condition. See PR22606 and D8802 for more details.
This is fixed by using _Exit to prevent cleanup.
notify_all_at_thread_exit.pass.cpp exercises the same race condition but for different reasons. I fixed this test by manually joining the thread before beginning program termination.