【Linux多线程编程-自学记录】07.线程清除

Linux多线程编程学习代码(代码已上传gitee,还请各位兄弟点个Star哦!)

https://gitee.com/chenshao777/linux_thread.git


笔记:
线程可以安排它退出时的清理操作,这与进程的可以用atexit函数安排进程退出时需要调用的函数类似。
这样的函数称为 “线程清理处理程序”。
线程可以建立多个清理处理程序,处理程序记录在栈中,所以这些处理程序执行的顺序与他们注册的顺序相反

pthread_cleanup_push (void (rtn) (void) , void *args) //注册处理程序
pthread_cleanup_pop ( int excute) //清除处理程序

这两个函数要成对的出现,否则编译无法通过
当执行以下操作时调用清理函数,清理函数的参数由args传入
1、调用pthread_exit
2、响应取消请求(请你来验证)
3、用非零参数调用pthread_cleanup_pop


spu.h文件

#ifndef _SPU_H_
#define _SPU_H_

#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
#include<errno.h>

#endif

07.thread_cleanup.c文件

/*
  线程安排它退出时的清理操作
  1.创建两个线程
  2.线程1、2中分别执行清除操作
  3.pthread_cleanup_pop(0)表示不执行pthread_cleanup_pop(非0)表示执行
  4.如果先执行了pthread_exit(),pthread_cleanup_pop(0)也会响应并清理线程
*/

#include "spu.h"

void clean_handle(void *arg)
{
    
    
    printf("clean %s\n",arg);
}

void *thread_fun1(void *arg)
{
    
    
    void *__retval;
    printf("I am thread 1\n");
    
    pthread_cleanup_push(clean_handle, "pthread01_1");
	pthread_exit(__retval);
    // 先执行pthread_exit,pthread_cleanup_pop(0)也会响应并清理线程
    pthread_cleanup_pop(0);  //非0即执行操作
}

void *thread_fun2(void *arg)
{
    
    
    printf("I am thread 2\n");
    
    pthread_cleanup_push(clean_handle, "pthread02_1"); //先入栈后出
    pthread_cleanup_push(clean_handle, "pthread02_2"); 

    pthread_cleanup_pop(1);   //非0即执行操作
    pthread_cleanup_pop(1);   //非0即执行操作

	return (void*)2;
}

int main(int argc, char *argv[])
{
    
    	
	int err1, err2;
	pthread_t thread_id1, thread_id2; 
    int s;

    void *__retval;

	err1 = pthread_create(&thread_id1, NULL, thread_fun1, NULL);
	if(err1 != 0)
		printf("create thread01 failed!\n");

    err2 = pthread_create(&thread_id2, NULL, thread_fun2, NULL);
	if(err2 != 0)
		printf("create thread02 failed!\n"); 

    sleep(2);
    pthread_exit(__retval);
}

猜你喜欢

转载自blog.csdn.net/HuangChen666/article/details/130458091