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);
}