2018-05-23 Linux 多线程死锁

2018-05-23  本文已影响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);
        }
}
上一篇 下一篇

猜你喜欢

热点阅读