[原]死锁小笔记

胡佳露 18/02/02 21:28:22

互斥锁(互斥量)

互斥量可以帮助线程同步对共享资源的使用,防止线程A试图访问一个共享变量的时候,此时线程B正在对这个共享变量进行修改。目的保护共享变量的的访问。

死锁

死锁情况一般是一个线程需要访问多个不同的共享资源的时候,但是每一个资源又都由不同的互斥量来管理,当超过一个线程(比如子线程已经对互斥量b进行量加锁后,此时主线程试图对互斥量b进行加锁时候,要等待子线程中的b解锁,若此时子线程的下一步执行操作是对互斥量a加锁,而如果一开始主线程就已经在先给互斥量a加锁后才试图给互斥量b加锁的话,并且此时互斥量a还没有解锁,那么此时的主线程和子线程都在等待状态中,造成了死锁现象)对一个互斥量加锁的时候就有可能因为先后顺序的原因造成死锁现象的产生。

死锁例子


#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<stdio.h>
using namespace std;

int a = 0;
int b = 0;

pthread_mutex_t mutex_a;
pthread_mutex_t mutex_b;

void *another(void *arg)
{
    //给互斥量b上锁
    pthread_mutex_lock(&mutex_b);
    cout << "in child thread got mutex b,waiting for mutex a\n";
    sleep(5);
    ++b;
    cout << "in child thread watite mutex_a\n";
    pthread_mutex_lock(&mutex_a);
    b += a++;
    pthread_mutex_unlock(&mutex_a);
    pthread_mutex_unlock(&mutex_b);
    pthread_exit(NULL);
}

int main()
{
    pthread_t id;

    pthread_mutex_init(&mutex_a, NULL);
    pthread_mutex_init(&mutex_b, NULL);

    //执行子线程
    pthread_create(&id, NULL, another, NULL);

    //主线程给互斥量a上锁
    pthread_mutex_lock(&mutex_a);
    cout << "in parent thread ,got mutex a,waiting for mutex b\n";
    sleep(5);
    ++a;
    cout << "in parent thread waite mutex_b\n";
    pthread_mutex_lock(&mutex_b);
    a += b++;
    pthread_mutex_unlock(&mutex_b);
    pthread_mutex_unlock(&mutex_a);

    pthread_join(id, NULL);
    pthread_mutex_destroy(&mutex_a);
    pthread_mutex_destroy(&mutex_b);
    return 0;
}

程序中,由于调用了sleep函数作为时间差来保障,有一个线程先占用一把互斥锁,所以主线程先占有了mutex_a,子线程占有mutex_b。此时主线程占有a,子线程占有了b,然后主线程并没有立马释放a而是又申请b,但是此时b已经被子线程占有,主线程只能处于等待状态。而与此同时子线程又试图占有a,可是a并没有释放,所以子线程也处于等待的一个状态。在这样两个线程就僵持不住谁都不能往下继续执行了,从而造成了死锁。

作者:qq_36573828 发表于 2018/02/02 21:28:22 原文链接 http://blog.csdn.net/qq_36573828/article/details/79243331
阅读:15