死锁概念
死锁(Deadlock)由于某种逻辑问题,导致等待一个永远无法获得的资源的困境
产生死锁的原因
- 连续多次上锁
- 忘记解锁
- 线程未解锁就被取消
示例1 连续上锁
#include<stdio.h>
#include<pthread.h>
#include <unistd.h>
// 定义互斥锁
pthread_mutex_t mutex;
int global = 0;
void *fun()
{
// 上锁
pthread_mutex_lock(&mutex);
pthread_mutex_lock(&mutex); //连续上锁
global = 10;
printf("global=%d\n",global);
//解锁
pthread_mutex_unlock(&mutex);
}
int main(int argc, char const *argv[])
{
// 初始化互斥锁
pthread_mutex_init(&mutex,NULL);
pthread_t pid;
pthread_create(&pid,NULL,fun,NULL);
pthread_join(pid,NULL);
return 0;
}
示例2 忘记解锁
#include<stdio.h>
#include<pthread.h>
#include <unistd.h>
// 定义互斥锁
pthread_mutex_t mutex;
int global = 0;
void *fun()
{
// 连续上锁
pthread_mutex_lock(&mutex);
global = 10;
printf("global=%d\n",global);
//pthread_mutex_unlock(&mutex); //忘记解锁
}
int main(int argc, char const *argv[])
{
// 初始化互斥锁
pthread_mutex_init(&mutex,NULL);
pthread_t pid;
pthread_create(&pid,NULL,fun,NULL);
pthread_join(pid,NULL);
return 0;
}
示例三 线程未解锁就被取消
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
// 定义互斥锁
pthread_mutex_t mutex;
int global = 0;
void *fun()
{
// 连续上锁
pthread_mutex_lock(&mutex);
// pthread_mutex_lock(&mutex);
global = 100;
while (global--)
{
printf("global=%d\n", global);
}
pthread_mutex_unlock(&mutex); // 忘记解锁
}
int main(int argc, char const *argv[])
{
// 初始化互斥锁
pthread_mutex_init(&mutex, NULL);
pthread_t pid;
pthread_create(&pid, NULL, fun, NULL);
// 未解锁就取消线程
sleep(5);
pthread_cancel(pid);
pthread_join(pid, NULL);
return 0;
}
解决死锁的方法
线程取消历程函数
压栈
pthread_cleanup_push(void fun(void * arg), 参数);
出栈
ptread_cleanup_pop(int arg);
arg 0 不执行历程函数
1 执行历程函数
示例4 避免死锁
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
// 定义互斥锁
pthread_mutex_t mutex;
int global = 0;
void rount()
{
pthread_mutex_unlock(&mutex);
}
void *fun()
{
// 压栈
pthread_cleanup_push(rount,NULL);
// 连续上锁
pthread_mutex_lock(&mutex);
// pthread_mutex_lock(&mutex);
global = 100;
while (global--)
{
sleep(1);
printf("global=%d\n", global);
}
pthread_mutex_unlock(&mutex); // 忘记解锁
pthread_cleanup_pop(1);
}
int main(int argc, char const *argv[])
{
// 初始化互斥锁
pthread_mutex_init(&mutex, NULL);
pthread_t pid;
pthread_create(&pid, NULL, fun, NULL);
// 未解锁就取消线程
sleep(5);
pthread_cancel(pid);
pthread_join(pid, NULL);
return 0;
}