【linux 多线程并发】线程退出自动清理函数的使用,释放线程申请的资源,异常退出自动调用
在Linux下,可以使用pthread_cleanup_push
和pthread_cleanup_pop
宏来注册线程退出时的清理函数。这样,即使线程以非正常方式退出(例如,被cancel),也能确保释放线程占用的资源。
以下是一个简单的例子,演示了如何使用这两个函数:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void cleanup_handler(void *arg) {
printf("Cleanup handler: resource %s freed\n", (char *)arg);
}
void *thread_function(void *arg) {
// 注册清理函数
pthread_cleanup_push(cleanup_handler, "thread-specific resource");
// 模拟工作
printf("Thread starting...\n");
sleep(1);
// 如果执行到这里,线程会正常退出,不会调用清理函数
// 如果线程被cancel,将会调用清理函数
// 注册的清理函数将在这里被调用,如果线程退出时没有被手动调用
pthread_cleanup_pop(0);
return NULL;
}
int main() {
pthread_t thread;
// 创建线程
if (pthread_create(&thread, NULL, &thread_function, NULL) != 0) {
perror("pthread_create failed");
return 1;
}
// 等待线程完成
pthread_join(thread, NULL);
return 0;
}
在这个例子中,pthread_cleanup_push
和pthread_cleanup_pop
被用来注册一个清理函数cleanup_handler
。如果线程通过pthread_cleanup_pop
正常退出,则不会调用清理函数。但如果线程被其他方式取消(例如,通过pthread_cancel
),则在退出时会自动调用cleanup_handler
函数。这确保了即使是异常情况,资源(在这个例子中是"thread-specific resource")也会被正确释放。
评论已关闭