$ uname -a NetBSD chieftec 8.99.6 NetBSD 8.99.6 (GENERIC) #7: Thu Nov 9 20:58:03 CET 2017 root@chieftec:/public/netbsd-root/sys/arch/amd64/compile/GENERIC amd64 $ ./bin/clang++ mutex.cc -o mutex -g -o mutex -O0 -fsanitize=thread -pthread $ cat mutex.cc #include #include #include typedef unsigned long long invisible_barrier_t; // Default instance of the barrier, but a test can declare more manually. invisible_barrier_t barrier; #ifdef __cplusplus extern "C" { void __tsan_testonly_barrier_wait(invisible_barrier_t *barrier); unsigned long __tsan_testonly_shadow_stack_current_size(); #ifdef __cplusplus } #endif static inline void barrier_init(invisible_barrier_t *barrier, unsigned count) { __tsan_testonly_barrier_init(barrier, count); } static inline void barrier_wait(invisible_barrier_t *barrier) { __tsan_testonly_barrier_wait(barrier); } int Global; pthread_mutex_t mtx; void *Thread1(void *x) { barrier_wait(&barrier); pthread_mutex_lock(&mtx); Global++; pthread_mutex_unlock(&mtx); return NULL; } void *Thread2(void *x) { Global--; barrier_wait(&barrier); return NULL; } void fn(void) { printf("%s\n", __func__); return; } pthread_once_t once_control = PTHREAD_ONCE_INIT; int main() { barrier_init(&barrier, 2); // CHECK: WARNING: ThreadSanitizer: data race // CHECK: Write of size 4 at {{.*}} by thread T1 // CHECK: (mutexes: write [[M1:M[0-9]+]]): // CHECK: Previous write of size 4 at {{.*}} by thread T2: // CHECK: Mutex [[M1]] (0x{{.*}}) created at: // CHECK: #0 pthread_mutex_init // CHECK: #1 main {{.*}}mutexset1.cc:[[@LINE+1]] pthread_mutex_init(&mtx, 0); pthread_t t[2]; // pthread_once(&once_control, fn); pthread_create(&t[0], NULL, Thread1, NULL); pthread_create(&t[1], NULL, Thread2, NULL); pthread_join(t[0], NULL); pthread_join(t[1], NULL); pthread_mutex_destroy(&mtx); } $ ./mutex ================== WARNING: ThreadSanitizer: data race (pid=2142) Write of size 4 at 0x0000014fab00 by thread T1 (mutexes: write M76): #0 Thread1(void*) /public/llvm-build/mutex.cc:36:9 (mutex+0x46ebbc) Previous write of size 4 at 0x0000014fab00 by thread T2: #0 Thread2(void*) /public/llvm-build/mutex.cc:42:9 (mutex+0x46ec87) Location is global 'Global' of size 4 at 0x0000014fab00 (mutex+0x0000014fab00) Mutex M76 (0x0000014fab08) created at: #0 pthread_mutex_init /public/llvm/projects/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc:1147:3 (mutex+0x413ef3) #1 main /public/llvm-build/mutex.cc:66:3 (mutex+0x46ed66) Thread T1 (tid=2, running) created by main thread at: #0 pthread_create /public/llvm/projects/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc:931:3 (mutex+0x412cf0) #1 main /public/llvm-build/mutex.cc:71:3 (mutex+0x46ed85) Thread T2 (tid=3, finished) created by main thread at: #0 pthread_create /public/llvm/projects/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc:931:3 (mutex+0x412cf0) #1 main /public/llvm-build/mutex.cc:72:3 (mutex+0x46eda4) SUMMARY: ThreadSanitizer: data race /public/llvm-build/mutex.cc:36:9 in Thread1(void*) ================== ThreadSanitizer: reported 1 warnings