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;
}
相关推荐
杉氧3 小时前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
召钱熏3 小时前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
杉氧4 小时前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
通玄4 小时前
Jetpack Compose 入门系列(七):ViewModel 与界面状态管理
android
落魄Android在线炒饭4 小时前
Android Framework 开发技巧:android.jar 生成与系统快速编译验证
android
如此风景5 小时前
Kotlin Flow操作符学习
android·kotlin
plainGeekDev6 小时前
GreenDAO → Room
android·java·kotlin
weiggle6 小时前
第八篇:ViewModel + Compose——生产级状态管理实践
android
恋猫de小郭11 小时前
Amper 正式转正 Kotlin Toolchain ,Gradle 未来何去何从
android·前端·flutter
plainGeekDev12 小时前
ButterKnife → ViewBinding
android·java·kotlin