llvm-project

Форк
0
45 строк · 1.3 Кб
1
// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
2
#include "test.h"
3

4
int Global;
5
pthread_mutex_t mtx1;
6
pthread_mutex_t mtx2;
7

8
void *Thread1(void *x) {
9
  barrier_wait(&barrier);
10
  pthread_mutex_lock(&mtx1);
11
  pthread_mutex_lock(&mtx2);
12
  Global++;
13
  pthread_mutex_unlock(&mtx2);
14
  pthread_mutex_unlock(&mtx1);
15
  return NULL;
16
}
17

18
void *Thread2(void *x) {
19
  Global--;
20
  barrier_wait(&barrier);
21
  return NULL;
22
}
23

24
int main() {
25
  barrier_init(&barrier, 2);
26
  // CHECK: WARNING: ThreadSanitizer: data race
27
  // CHECK: Write of size 4 at {{.*}} by thread T1
28
  // CHECK:               (mutexes: write [[M1:M[0-9]+]], write [[M2:M[0-9]+]]):
29
  // CHECK:   Previous write of size 4 at {{.*}} by thread T2:
30
  // CHECK:   Mutex [[M1]] (0x{{.*}}) created at:
31
  // CHECK:     #0 pthread_mutex_init
32
  // CHECK:     #1 main {{.*}}mutexset3.cpp:[[@LINE+4]]
33
  // CHECK:   Mutex [[M2]] (0x{{.*}}) created at:
34
  // CHECK:     #0 pthread_mutex_init
35
  // CHECK:     #1 main {{.*}}mutexset3.cpp:[[@LINE+2]]
36
  pthread_mutex_init(&mtx1, 0);
37
  pthread_mutex_init(&mtx2, 0);
38
  pthread_t t[2];
39
  pthread_create(&t[0], NULL, Thread1, NULL);
40
  pthread_create(&t[1], NULL, Thread2, NULL);
41
  pthread_join(t[0], NULL);
42
  pthread_join(t[1], NULL);
43
  pthread_mutex_destroy(&mtx1);
44
  pthread_mutex_destroy(&mtx2);
45
}
46

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.