3.10、死锁

1.死锁的是什么,什么情况出现死锁

  • 有时,一个线程需要同时访问两个或更多不同的共享资源,而每个资源又都由不同的互斥量管理。当超过一个线程加锁同一组互斥量时,就有可能发生死锁。
  • 两个或两个以上的进程在执行过程中,因争夺共享资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。
  • 死锁的几种场景:
    • 忘记释放锁
    • 重复加锁
    • 多线程多锁,抢占锁资源

多线程多锁,抢占锁资源的情况
在这里插入图片描述

2.死锁的多线程多锁,抢占锁资源情况实现

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>

// 只展示多线程多锁,抢占锁资源

pthread_mutex_t mutex1, mutex2;

void * workA(void * arg) 
{
    
    
    pthread_mutex_lock(&mutex1);
    sleep(1);
    pthread_mutex_lock(&mutex2);

    printf("workA...\n");

    pthread_mutex_unlock(&mutex2);
    pthread_mutex_unlock(&mutex1);
}

void * workB(void * arg)
{
    
    
    pthread_mutex_lock(&mutex2);
    sleep(1);
    pthread_mutex_lock(&mutex1);

    printf("workB...\n");

    pthread_mutex_unlock(&mutex1);
    pthread_mutex_unlock(&mutex2);
}

int main()
{
    
    
    // 初始化锁
    pthread_mutex_init(&mutex1, NULL);
    pthread_mutex_init(&mutex2, NULL);

    // 创建两个线程
    pthread_t tid1, tid2;
    pthread_create(&tid1, NULL, workA, NULL);
    pthread_create(&tid2, NULL, workB, NULL);

    // 回收线程
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);

    // 释放锁的资源
    pthread_mutex_destroy(&mutex1);
    pthread_mutex_destroy(&mutex2);

    // 结束主线程,不影响别的线程的执行
    pthread_exit(NULL);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/z2812470857/article/details/130094896