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;
}
相关推荐
祈安_9 小时前
C语言内存函数
c语言·后端
norlan_jame2 天前
C-PHY与D-PHY差异
c语言·开发语言
czy87874752 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言
m0_531237172 天前
C语言-数组练习进阶
c语言·开发语言·算法
Z9fish2 天前
sse哈工大C语言编程练习23
c语言·数据结构·算法
代码无bug抓狂人2 天前
C语言之单词方阵——深搜(很好的深搜例题)
c语言·开发语言·算法·深度优先
青桔柠薯片2 天前
Linux软件编程:线程和进程间通信
linux·开发语言·线程·进程
CodeJourney_J2 天前
从“Hello World“ 开始 C++
c语言·c++·学习
枫叶丹42 天前
【Qt开发】Qt界面优化(七)-> Qt样式表(QSS) 样式属性
c语言·开发语言·c++·qt
with-the-flow2 天前
从数学底层的底层原理来讲 random 的函数是怎么实现的
c语言·python·算法