brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.0 KiB · 05ea672 Raw
54 lines · c
1// RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s2// CHECK-NOT: WARNING: ThreadSanitizer: data race3// CHECK-NOT: ThreadSanitizer WARNING: double lock4// CHECK-NOT: ThreadSanitizer WARNING: mutex unlock by another thread5// CHECK: OK6 7#include <stdio.h>8#include <stdlib.h>9#include <pthread.h>10 11pthread_mutex_t m;12pthread_cond_t c;13int x;14 15void *thr1(void *p) {16  int i;17 18  for (i = 0; i < 10; i += 2) {19    pthread_mutex_lock(&m);20    while (x != i)21      pthread_cond_wait(&c, &m);22    x = i + 1;23    pthread_cond_signal(&c);24    pthread_mutex_unlock(&m);25  }26  return 0;27}28 29void *thr2(void *p) {30  int i;31 32  for (i = 1; i < 10; i += 2) {33    pthread_mutex_lock(&m);34    while (x != i)35      pthread_cond_wait(&c, &m);36    x = i + 1;37    pthread_mutex_unlock(&m);38    pthread_cond_broadcast(&c);39  }40  return 0;41}42 43int main() {44  pthread_t th1, th2;45 46  pthread_mutex_init(&m, 0);47  pthread_cond_init(&c, 0);48  pthread_create(&th1, 0, thr1, 0);49  pthread_create(&th2, 0, thr2, 0);50  pthread_join(th1, 0);51  pthread_join(th2, 0);52  fprintf(stderr, "OK\n");53}54