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);
}
}
网友评论