多线程造成死锁的例子

1、假设有如下代码

   pthread_mutex_t mutex;   //代表一个全局互斥对象

   void  A()

      {

          mutex.lock();

          //这里操作共享数据

          B();  //这里调用B方法

          mutex.unlock();

         return;

      }

 

   void  B()

      {

          mutex.lock();

          //这里操作共享数据

          mutex.unlock();

         return;

      }

int main(){

int err;
pthread_t tid1;

pthread_t tid2;

pthread_create(&tid1,NULL,A,NULL);
pthread_create(&tid2,NULL,B,NULL);
return 0;
}

此时会由于在A、B方法中相互等待unlock而导致死锁。

2、假设有如何代码

   mutex;   //代表一个全局互斥对象

   void  A()

      {

          mutex.lock();

          //这里操作共享数据

           if(.....)

          {

              return;

           }

         mutex.unlock();

         return;

      }

由于在if的执行体内直接retun,而没有调用unlock,导致另一个线程再调用A方法就出现死锁。

参考:http://www.cnblogs.com/lidabo/p/3024829.html

3.我自己又想了个例子,由于多线程下调用fork()之后只有当前进程的控制线程保留下来了,其它线程全部消失,如果其它线程正在持有某个锁,那么由于该线程的死亡它再也没有机会死锁,此时如果子进程的那个唯一线程企图获取那个锁,则必然是死锁。

#include  
#include   

   void  A()

      {

          mutex.lock();

  sleep(1); //睡一会儿,让线程放弃锁延后一些

          mutex.unlock();

         return;

      }


int main ()   
{   
    pid_t fpid; //fpid表示fork函数返回的值  
     pthread_mutex_t mutex;

   pthread_t tid1;

   pthread_create(&tid1,NULL,A,NULL);

    fpid=fork();   
    if (fpid < 0)   
        printf("error in fork!");   
    else if (fpid == 0) {  
        printf("i am the child process, my process id is %d/n",getpid());   
mutex.lock(); //由于线程A在子进程中不存在,无法再次获取这个锁,子进程死锁
    }  
    else {  
        printf("i am the parent process, my process id is %d/n",getpid());   
     
    }  
    return 0;  
}  

这里有篇博文详细表述了我想的例子

http://blog.csdn.net/hanchaoman/article/details/5685582

你可能感兴趣的:(操作系统)