多线程造成死锁的例子

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 <unistd.h>  
#include <stdio.h>   

   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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值