pthread_self()
返回值是自己的tid号,线程号。
tid1和tid2两个线程不知道谁先执行,程序自带一个主线程,主线程结束全部结束,所以在最后加上while死循环,主线程不会等其他线程执行完在执行下一步,。
线程退出
传双星,改变指针的指向,单星改变指针指向的内容
pthread_join
接收线程返回值,回收8M的栈区
pthread_creat()相传多个数据时,可以传入结构体
结构体初始化
void强转问题,不知道基类型是什么,无法开辟确定空间,*p可以+1,偏移一个字节,void偏移不知道多少个。
强制转换问题
重要
pthread_detach
不能调join
清理函数,回收资源
man -k 部分函数名 模糊搜素
函数指针数组
pthread_detach
第二种设置分离属性:
int pthread_deatch(pthread_t thread);
功能,设置分离属性
参数,线程id号,填自己的id
do{
}while()
在 POSIX 线程库中,pthread_detach
函数用于将一个线程标记为“分离”状态,,使用该函数后不可以使用pthread_join函数来回收线程资源。分离状态的线程在结束时会自动释放其资源,不需要其他线程调用 pthread_join
来等待它完成。以下是详细的说明:
函数原型
int pthread_detach(pthread_t thread);
参数
thread
:要设置为分离状态的线程的线程 ID(pthread_t
类型)。
重点:当我的程序中没有sleep时,线程是和主线程一块执行的,所以不知道子线程快还是主线程快结束,所以才需要加一个延时。
void pthread_cleanup_push(void (*routine)(void *), void *arg);
功能:注册一个线程清理函数
参数,routine,线程清理函数的入口
arg,清理函数的参数。
返回值,无
void pthread_cleanup_pop(int execute);
功能:调用清理函数
execute,非0 执行清理函数
0 ,不执行清理
返回值,无
pthread_cleanup_push
和 pthread_cleanup_pop
是 POSIX 线程库中的两个函数,用于线程清理和资源释放。这些函数的主要作用是确保在线程退出时执行特定的清理操作。它们通常用于处理线程中的资源管理,确保在异常情况下也能正确释放资源,避免资源泄漏。
函数原型
-
pthread_cleanup_push
void pthread_cleanup_push(void (*routine)(void *), void *arg);
routine
:一个指向清理函数的指针。这个函数会在线程退出时被调用。arg
:传递给清理函数的参数。
-
pthread_cleanup_pop
void pthread_cleanup_pop(int execute);
execute
:一个整数标志,用于指示是否在线程退出时调用清理函数。execute
为非零值时,清理函数会被调用;如果为零,清理函数不会被调用。
作用和使用
清理操作的目的
-
资源释放:在多线程编程中,线程可能会持有某些资源(如文件描述符、内存等)。如果线程在执行过程中发生异常退出,这些资源可能不会被正确释放。
pthread_cleanup_push
和pthread_cleanup_pop
提供了一种机制来确保这些资源在线程退出时被正确释放。 -
确保一致性:这些函数可以确保线程在退出时按照预期执行清理操作,从而维持程序的稳定性和一致性。
使用示例
以下是一个示例,演示了如何使用 pthread_cleanup_push
和 pthread_cleanup_pop
来确保线程退出时正确释放资源:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
// 清理函数
void cleanup(void *arg) {
printf("Cleaning up: %s\n", (char *)arg);
}
// 线程函数
void* threadFunction(void *arg) {
pthread_cleanup_push(cleanup, "Resource1");
printf("Thread is running...\n");
// 模拟工作
sleep(1);
// 在这里线程正常退出
pthread_cleanup_pop(1); // 执行清理函数
return NULL;
}
int main() {
pthread_t thread;
int result;
// 创建线程
result = pthread_create(&thread, NULL, threadFunction, NULL);
if (result != 0) {
fprintf(stderr, "Error creating thread\n");
return 1;
}
// 等待线程结束
pthread_join(thread, NULL);
return 0;
}
详细解释
-
pthread_cleanup_push
:在threadFunction
函数中,pthread_cleanup_push
被用来注册一个清理函数cleanup
,并将参数"Resource1"
传递给它。这个清理函数会在线程退出时执行。 -
pthread_cleanup_pop
:在pthread_cleanup_pop(1)
调用时,execute
参数为非零值,表示清理函数cleanup
会被调用。如果execute
为 0,则清理函数不会被调用。这样可以在正常退出或异常退出时决定是否执行清理操作。
注意事项
-
配对使用:
pthread_cleanup_push
和pthread_cleanup_pop
必须成对使用。每次调用pthread_cleanup_push
必须有一个对应的pthread_cleanup_pop
。如果不成对使用,可能导致未定义行为。 -
清理函数的调用:
pthread_cleanup_pop(1)
会调用清理函数,而pthread_cleanup_pop(0)
则不会调用清理函数。通常,在正常退出线程的代码路径上调用pthread_cleanup_pop(1)
,而在错误路径或异常退出时使用pthread_cleanup_pop(0)
。 -
清理函数的设计:清理函数应该是简单且快速的,因为它会在线程退出时被调用。在清理函数中避免复杂的操作,尤其是可能阻塞的操作,以避免引入新的问题。
-
异常处理:
pthread_cleanup_push
和pthread_cleanup_pop
可以在设置了清理操作的线程内出现异常情况时,确保资源被正确释放。
通过合理使用 pthread_cleanup_push
和 pthread_cleanup_pop
,可以有效地管理线程中的资源,确保程序在多线程环境下的稳定性和可靠性。
作业
写法函数指针数组 要记
typedef常用场景
1.取别名