Ultima attività 1749041370

deadlock.c Raw
1// gcc -g ./s.c -o deadlock_demo -lpthread
2// sudo valgrind --tool=helgrind ./deadlock_demo
3
4#include <pthread.h>
5#include <stdio.h>
6#include <unistd.h>
7
8pthread_mutex_t lock_a = PTHREAD_MUTEX_INITIALIZER;
9pthread_mutex_t lock_b = PTHREAD_MUTEX_INITIALIZER;
10
11int shared_data = 0;
12
13void* thread_func1(void* arg) {
14 pthread_mutex_lock(&lock_a);
15 printf("Thread 1 acquired lock A\n");
16 shared_data += 1; // 写入共享数据
17 sleep(1);
18 pthread_mutex_lock(&lock_b);
19 printf("Thread 1 acquired lock B\n");
20 shared_data += 1;
21
22 pthread_mutex_unlock(&lock_b);
23 pthread_mutex_unlock(&lock_a);
24 return NULL;
25}
26
27void* thread_func2(void* arg) {
28 pthread_mutex_lock(&lock_b);
29 printf("Thread 2 acquired lock B\n");
30 shared_data += 1;
31 sleep(1);
32 pthread_mutex_lock(&lock_a);
33 printf("Thread 2 acquired lock A\n");
34 shared_data += 1;
35
36 pthread_mutex_unlock(&lock_a);
37 pthread_mutex_unlock(&lock_b);
38 return NULL;
39}
40
41
42int main() {
43 pthread_t t1, t2;
44
45 pthread_create(&t1, NULL, thread_func1, NULL);
46 pthread_create(&t2, NULL, thread_func2, NULL);
47
48 pthread_join(t1, NULL);
49 pthread_join(t2, NULL);
50
51 printf("Done.\n");
52 return 0;
53}
54