pthread_once

、pthread_once 核心作用(一句话讲透)

pthread_once 是 POSIX 线程库提供的线程安全的一次性初始化接口 ,保证某段初始化代码在进程生命周期内,无论多少线程调用,只会被执行一次(且仅执行一次),解决多线程环境下「初始化代码重复执行」的问题。

二、为什么需要 pthread_once?

多线程程序中,如果多个线程同时执行初始化逻辑(比如创建全局单例、初始化共享资源),直接写判断会有竞态条件 (比如线程 A 刚判断 "未初始化",线程 B 也判断 "未初始化",导致重复初始化)。而 pthread_once 由系统保证原子性,无需手动加锁 / 解锁,更简洁、安全。

三、核心用法(C++ 代码示例)

1. 基础使用步骤
复制代码
#include <pthread.h>
#include <iostream>
#include <unistd.h>

// 1. 定义once控制变量,必须初始化为PTHREAD_ONCE_INIT
pthread_once_t once_var = PTHREAD_ONCE_INIT;

// 2. 定义需要一次性执行的初始化函数
void init_resource() {
    std::cout << "初始化函数执行,线程ID:" << pthread_self() << std::endl;
    // 这里可以放:创建单例、初始化全局资源、加载配置等逻辑
    static int global_data = 0;
    global_data = 100; // 仅初始化一次
}

// 线程执行函数
void* thread_func(void* arg) {
    int thread_num = *(int*)arg;
    std::cout << "线程" << thread_num << "调用pthread_once前,ID:" << pthread_self() << std::endl;
    
    // 3. 调用pthread_once,触发初始化(仅第一次调用生效)
    pthread_once(&once_var, init_resource);
    
    std::cout << "线程" << thread_num << "调用pthread_once后" << std::endl;
    return nullptr;
}

int main() {
    pthread_t t1, t2, t3;
    int num1 = 1, num2 = 2, num3 = 3;

    // 创建3个线程,都调用pthread_once
    pthread_create(&t1, nullptr, thread_func, &num1);
    pthread_create(&t2, nullptr, thread_func, &num2);
    pthread_create(&t3, nullptr, thread_func, &num3);

    // 等待线程结束
    pthread_join(t1, nullptr);
    pthread_join(t2, nullptr);
    pthread_join(t3, nullptr);

    return 0;
}
相关推荐
大圣编蚕5 小时前
初探 NDK 的世界:从零开始理解 Android 原生开发
android
云贝贝贝5 小时前
MySQL 慢查询定位与索引优化实战
android
骑着蜗牛撵大象3276 小时前
服务下线不再炸:分层关闭、TCP 存活探测与负载均衡排水的落地套路
android·tcp/ip·负载均衡·tcp·高可用·健康检查·优雅关闭
三少爷的鞋8 小时前
别再这么写协程了!Marcin Moskała 剖析的 几个常见协程误区与重构
android
mmsx10 小时前
Android 防二次打包第一道锁:签名校验与完整性校验
android·kotlin
mmsx10 小时前
Android 混淆不等于安全:二次打包链路完整走一遍
android·kotlin
小宋102112 小时前
Agent轨迹级评测实战:工具选择、预算超限与回归门禁
android·网络·人工智能·回归
墨天梦13 小时前
D05_ViewModel与单向数据流
android·kotlin
蒸鱼Yuzheng15 小时前
Android 构建可复现性:APK 指纹、文件级差异与供应链审计
android·apk·devops·软件供应链·可复现构建
墨天梦17 小时前
D03_Compose列表与稳定身份
android·gitee·kotlin