Linux死锁是指两个或多个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,这些进程都将无法继续执行。以下是关于Linux死锁的详细解释:
以下是一个简单的死锁示例,两个线程分别持有对方需要的锁并请求对方的锁:
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;
void* thread1(void* arg) {
pthread_mutex_lock(&lock1);
printf("Thread 1 acquired lock1
");
sleep(1); // 模拟一些工作
pthread_mutex_lock(&lock2);
printf("Thread 1 acquired lock2
");
pthread_mutex_unlock(&lock2);
pthread_mutex_unlock(&lock1);
return NULL;
}
void* thread2(void* arg) {
pthread_mutex_lock(&lock2);
printf("Thread 2 acquired lock2
");
sleep(1); // 模拟一些工作
pthread_mutex_lock(&lock1);
printf("Thread 2 acquired lock1
");
pthread_mutex_unlock(&lock1);
pthread_mutex_unlock(&lock2);
return NULL;
}
int main() {
pthread_t t1, t2;
pthread_create(&t1, NULL, thread1, NULL);
pthread_create(&t2, NULL, thread2, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
return 0;
}
在这个例子中,thread1
和thread2
会分别持有lock1
和lock2
并请求对方的锁,从而导致死锁。
可以通过对锁进行排序来避免死锁:
void* thread1(void* arg) {
pthread_mutex_lock(&lock1);
printf("Thread 1 acquired lock1
");
sleep(1);
pthread_mutex_lock(&lock2);
printf("Thread 1 acquired lock2
");
pthread_mutex_unlock(&lock2);
pthread_mutex_unlock(&lock1);
return NULL;
}
void* thread2(void* arg) {
pthread_mutex_lock(&lock1); // 先请求lock1
printf("Thread 2 acquired lock1
");
sleep(1);
pthread_mutex_lock(&lock2); // 再请求lock2
printf("Thread 2 acquired lock2
");
pthread_mutex_unlock(&lock2);
pthread_mutex_unlock(&lock1);
return NULL;
}
通过这种方式,确保所有线程都按相同的顺序请求锁,从而避免死锁的发生。
领取专属 10元无门槛券
手把手带您无忧上云