I've can confirm the bug with g++-6 on Debian (unstable as of 2016/11/14).
libtsan0: 6.2.0-13 g++-6: 6.2.0-13 When I compile the same software with g++-5 (5.4.1-3) in Debian or on Gentoo using g++-5.4.0 the error does not occur. In all cases the tsan library is libtsan.so.0.0.0. I've attached a test case that triggers the bug and also does double un-locking of a mutex to trigger the thread sanitizer. The test program was compiled with g++-5 -std=c++11 -fsanitize=thread -g double-unlock.cc -o \ double-unlock-ts-5 g++-6 -std=c++11 -fsanitize=thread -g double-unlock.cc -o \ double- unlock-ts-6 When running double-unlock-ts-5 the thread sanitizer reports the double mutex unlock (as expected). When running double-unlock-ts-6 the unexpected memory mapping error shows up as reported in this bug. Best, Gert
#include <thread> #include <mutex> #include <vector> #include <iostream> using namespace std; mutex g_mutex; void thread_function () { g_mutex.lock(); cout << "One thread\n"; g_mutex.unlock(); g_mutex.unlock(); } int main(int argc, const char ** args) { auto n_threads = thread::hardware_concurrency(); vector<thread> threads; for (int i = 0; i < n_threads; ++i) threads.push_back(thread(thread_function)); for (int i = 0; i < n_threads; ++i) threads[i].join(); return 0; }