线程(1)join、self

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 线程库中的两个函数,用于线程清理和资源释放。这些函数的主要作用是确保在线程退出时执行特定的清理操作。它们通常用于处理线程中的资源管理,确保在异常情况下也能正确释放资源,避免资源泄漏。

函数原型

  1. pthread_cleanup_push

    void pthread_cleanup_push(void (*routine)(void *), void *arg);
    
    • routine:一个指向清理函数的指针。这个函数会在线程退出时被调用。
    • arg:传递给清理函数的参数。
  2. pthread_cleanup_pop

    void pthread_cleanup_pop(int execute);
    
    • execute:一个整数标志,用于指示是否在线程退出时调用清理函数。execute 为非零值时,清理函数会被调用;如果为零,清理函数不会被调用。

作用和使用

清理操作的目的
  1. 资源释放:在多线程编程中,线程可能会持有某些资源(如文件描述符、内存等)。如果线程在执行过程中发生异常退出,这些资源可能不会被正确释放。pthread_cleanup_push 和 pthread_cleanup_pop 提供了一种机制来确保这些资源在线程退出时被正确释放。

  2. 确保一致性:这些函数可以确保线程在退出时按照预期执行清理操作,从而维持程序的稳定性和一致性。

使用示例

以下是一个示例,演示了如何使用 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;
}

详细解释
  1. pthread_cleanup_push:在 threadFunction 函数中,pthread_cleanup_push 被用来注册一个清理函数 cleanup,并将参数 "Resource1" 传递给它。这个清理函数会在线程退出时执行。

  2. pthread_cleanup_pop:在 pthread_cleanup_pop(1) 调用时,execute 参数为非零值,表示清理函数 cleanup 会被调用。如果 execute 为 0,则清理函数不会被调用。这样可以在正常退出或异常退出时决定是否执行清理操作。

注意事项

  1. 配对使用pthread_cleanup_push 和 pthread_cleanup_pop 必须成对使用。每次调用 pthread_cleanup_push 必须有一个对应的 pthread_cleanup_pop。如果不成对使用,可能导致未定义行为。

  2. 清理函数的调用pthread_cleanup_pop(1) 会调用清理函数,而 pthread_cleanup_pop(0) 则不会调用清理函数。通常,在正常退出线程的代码路径上调用 pthread_cleanup_pop(1),而在错误路径或异常退出时使用 pthread_cleanup_pop(0)

  3. 清理函数的设计:清理函数应该是简单且快速的,因为它会在线程退出时被调用。在清理函数中避免复杂的操作,尤其是可能阻塞的操作,以避免引入新的问题。

  4. 异常处理pthread_cleanup_push 和 pthread_cleanup_pop 可以在设置了清理操作的线程内出现异常情况时,确保资源被正确释放。

通过合理使用 pthread_cleanup_push 和 pthread_cleanup_pop,可以有效地管理线程中的资源,确保程序在多线程环境下的稳定性和可靠性。

作业

写法函数指针数组 要记

typedef常用场景

1.取别名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值