52 lines · cpp
1// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s2#include "test.h"3#include <semaphore.h>4 5struct A {6 A() {7 sem_init(&sem_, 0, 0);8 }9 virtual void F() {10 }11 void Done() {12 sem_post(&sem_);13 }14 virtual ~A() {15 sem_wait(&sem_);16 sem_destroy(&sem_);17 }18 sem_t sem_;19};20 21struct B : A {22 virtual void F() {23 }24 virtual ~B() { }25};26 27static A *obj = new B;28 29void *Thread1(void *x) {30 obj->F();31 obj->Done();32 barrier_wait(&barrier);33 return NULL;34}35 36void *Thread2(void *x) {37 barrier_wait(&barrier);38 delete obj;39 return NULL;40}41 42int main() {43 barrier_init(&barrier, 2);44 pthread_t t[2];45 pthread_create(&t[0], NULL, Thread1, NULL);46 pthread_create(&t[1], NULL, Thread2, NULL);47 pthread_join(t[0], NULL);48 pthread_join(t[1], NULL);49}50 51// CHECK: WARNING: ThreadSanitizer: data race on vptr52