码迷,mamicode.com
首页 > 其他好文 > 详细

死锁举例

时间:2015-04-08 00:48:08      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

一、互斥锁简介

POSIX线程同步方法有:POSIX信号量、互斥锁和条件变量。

互斥锁可以用于保护关键代码段,以确保其独占式的访问。当进去关键代码段时,我们需要获得互斥锁并将其加锁,等价于二进制信号量的P操作,当离开关键代码段时,我们需要对其解锁,等价于二进制信号量中的V操作。

互斥锁基础API:

技术分享

互斥锁属性,一些api来获取和设置互斥锁属性:

技术分享

二、死锁问题

死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

产生死锁的条件有四个:
1.互斥条件:所谓互斥就是进程在某一时间内独占资源。
2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

例如:多线程访问共享资源,由于访问的顺序不当所造成的,通常是一个线程锁定了一个资源A,而又想去锁定资源B;在另一个线程中,锁定了资源B,而又想去锁定资源A以完成自身的操作,两个线程都想得到对方的资源,而不愿释放自己的资源,造成两个线程都在等待,而无法执行的情况。

下面的程序,主线程占有mutex_a,等带mutex_b,而子线程占有mutex_b,等待mutex_a,造成死锁,由于死锁,程序将不能退出。

code: https://github.com/panzhengguang/Unix_Net_Programming/tree/master/pthread

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

int a = 0;
int b = 0;
pthread_mutex_t mutex_a;
pthread_mutex_t mutex_b;

void* another( void* arg )
{
    pthread_mutex_lock( &mutex_b );
    printf( "in child thread, got mutex b, waiting for mutex a\n" );
    sleep( 5 );
    ++b;
    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 );

    pthread_mutex_lock( &mutex_a );
    printf( "in parent thread, got mutex a, waiting for mutex b\n" );
    sleep( 5 );
    ++a;
    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;
}

死锁举例

标签:

原文地址:http://www.cnblogs.com/panweishadow/p/4401099.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!