1 // RUN: %clangxx_tsan -stdlib=libstdc++ -static-libstdc++ -O1 %s -o %t && %run %t 2>&1 | FileCheck %s 2 #include <pthread.h> 3 #include <stdlib.h> 4 #include <stdio.h> 5 #include <sched.h> 6 7 struct Cache { 8 int x; 9 explicit Cache(int x) 10 : x(x) { 11 } 12 }; 13 14 void *AsyncInit(void *p) { 15 return new Cache((int)(long)p); 16 } 17 18 Cache *CreateCache() { 19 pthread_t t; 20 pthread_create(&t, 0, AsyncInit, (void*)(long)rand()); 21 void *res; 22 pthread_join(t, &res); 23 return (Cache*)res; 24 } 25 26 void *Thread1(void *x) { 27 static Cache *c = CreateCache(); 28 if (c->x >= RAND_MAX) 29 exit(1); 30 return 0; 31 } 32 33 int main() { 34 pthread_t t[2]; 35 pthread_create(&t[0], 0, Thread1, 0); 36 pthread_create(&t[1], 0, Thread1, 0); 37 pthread_join(t[0], 0); 38 pthread_join(t[1], 0); 39 fprintf(stderr, "PASS\n"); 40 } 41 42 // CHECK-NOT: WARNING: ThreadSanitizer: data race 43