Linux多线程之线程控制与清理

  • 问题
    有时候希望线程退出时能够自动的执行某些函数,为了能达到此目的,OS 提供了两个函数帮我们完成这个功能
void pthread_cleanup_push(void (*rtn)(void*), void *arg);
void pthread_cleanup_pop(int execute);
这两个函数是成对使用的,缺一不可。
rtn: 清理函数指针,返回类型为 void 参数类型为void *
arg: 调用清理函数传递的参数
execute: 当为 1 时表示执行线程清理函数,0表示不执行
  • 示例
#include
#include
#include
#include

void clean_fun(void * arg)
{
    char *s=(char *)arg;
	printf("clean_func:%s\n",s);
}

void *th_fun(void *arg)
{
	int execute=(int)arg;
	pthread_cleanup_push(&clean_fun,"first clean func");
	pthread_cleanup_push(&clean_fun,"second clean func");
	pthread_cleanup_pop(execute);
	pthread_cleanup_pop(execute);
	return (void *)0;
}

int main(void)
{
	int err;
	pthread_t th1,th2;
	if((err=pthread_create(&th1,NULL,th_fun,(void *)1))!=0)
	{
		perror("pthread error\n");
	}
	pthread_join(th1,NULL);
	printf("th1(%lx) finish\n",th1);
    
	if((err=pthread_create(&th2,NULL,th_fun,(void *)1))!=0)
	{
		perror("pthread error\n");
	}
	pthread_join(th2,NULL);
	printf("th2(%lx) finish\n",th2);

	return 0;
}
//执行结果
clean_func:second clean func
clean_func:first clean func
th1(7f2881c95700) finish
clean_func:second clean func
clean_func:first clean func
th2(7f2881c95700) finish

你可能感兴趣的:(Linux多线程编程)