美文网首页
2018-05-23 Linux 多线程死锁

2018-05-23 Linux 多线程死锁

作者: 诸事圆成 | 来源:发表于2018-05-23 17:32 被阅读0次

    1.假设有两个线程

    A线程负责输出奇数。B线程负责输出偶数

    2.当A线程进入锁定状态时候,主线程突然异常将A线程停止,这时将导致B线程也无法继续执行,处于死锁状态。如下代码:

    #include<stdio.h>
    #include<pthread.h>
    #include<stdlib.h>
    
    static pthread_mutex_t mutex;
    void* run01(void *argv)
    {
      int i = 1;
      for(i;;i=i+2)
      {
        pthread_mutex_lock(&mutex);
        printf("奇数...[%d]\n",i);
        sleep(5);
        pthread_mutex_unlock(&mutex);
      }
    }
    void* run02(void *argv)
    {
      int i=2;
      for(i;;i=i+2)
      {
        pthread_mutex_lock(&mutex);
        printf("偶数...[%d]\n",i);
        sleep(6);
        pthread_mutex_unlock(&mutex);
      }
    }
    int main(int argc,char *argv[])
    {
      pthread_t thread[2];
      pthread_mutex_init(&mutex,0);
      for(int i=0;i<2;++i)
      {
        if(0==i)
        {  
            pthread_create(&thread[i],NULL,run01,NULL);
        }
        else  
        {
            pthread_create(&thread[i],NULL,run02,NULL);
        }
      }
      sleep(5);
      printf("外部强势结束thread[0]线程...\n");
      pthread_cancel(thread[0]);
      pthread_join(thread[0],(void **)0);
      pthread_join(thread[1],(void **)0);
      pthread_mutex_destroy(&mutex); 
      return 0;
    }
    

    解决方法:
    运用2个函数(其实是2个宏)

    pthread_cleanup_push
    
    pthread_cleanup_pop 这个对函数作用类似于atexit函数
    
    注意:这不是函数而是宏。必须成对使用。
    
    void pthread_cleanup_push(
    
    void (*routine)(void *),//回调函数
    
    void *arg //回调函数的参数
    
    );
    触发调用routine的条件:
    1.执行了exit()。
    2.执行了pthread_cancel()
    3.pthread_cleanup_pop(1);//参数必须是1
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    pthread_mutex_t m;
    void handle(void *d)
    {
            printf("退出后的调用!\n");
            pthread_mutex_unlock(&m);
    }
    void *runodd(void *d)
    {
            int i=0;
    
            for(i=1;;i+=2)
            {
                    pthread_cleanup_push(handle,0);
                    pthread_mutex_lock(&m);
                    printf("奇数:%d\n",i);
                    usleep(100);
                    pthread_mutex_unlock(&m);
                    pthread_cleanup_pop(0);
            }
    }
    void *runeven(void *d)
    {
            int i=0;
            for(i=0;;i+=2)
            {
                    pthread_mutex_lock(&m);
                    printf("偶数:%d\n",i);
                    usleep(100);
                    pthread_mutex_unlock(&m);
            }
    }
    

    相关文章

      网友评论

          本文标题:2018-05-23 Linux 多线程死锁

          本文链接:https://www.haomeiwen.com/subject/kbtdjftx.html