C语言线程之死锁

死锁概念

**死锁(Deadlock)**由于某种逻辑问题,导致等待一个永远无法获得的资源的困境

产生死锁的原因

  • 连续多次上锁
  • 忘记解锁
  • 线程未解锁就被取消
示例1 连续上锁
cpp 复制代码
#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 忘记解锁
cpp 复制代码
#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;
}
示例三 线程未解锁就被取消
cpp 复制代码
#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 避免死锁
cpp 复制代码
#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;
}
相关推荐
Rainy Blue8831 小时前
C转C++速成
c语言·c++·算法
exm-zem3 小时前
从C语言到C++:C++入门1
c语言·c++
牧以南歌〆5 小时前
数据结构<八>链式队列
c语言·数据结构·算法
无相求码6 小时前
数组越界为什么有时候不崩溃?VS2013 下栈上变量的幽灵布局解密
c语言·后端
是个西兰花7 小时前
Linux:深入解析Linux线程原理与实现
linux·运维·c++·线程·互斥锁
天空'之城9 小时前
C 语言工业级通用组件 02:通用内存池
c语言·嵌入式·内存管理·内存池
十月的皮皮11 小时前
C语言学习笔记20260717-预处理机制
c语言·笔记·学习
小保CPP11 小时前
OCR 在C语言中使用Tesseract API
c语言·c++·人工智能·算法·ocr·模式识别·光学字符识别
GeekArch12 小时前
第8讲:裸机单片机项目——Vibe快速迭代的最优边界
c语言·stm32·单片机·嵌入式硬件·mcu·物联网·ai编程
慧都小项12 小时前
C/C++ 静态分析为什么要前移?Parasoft C/C++test 在 IDE 与 CI/CD 中的应用
c语言·c++·ide·功能测试·ai