当前位置: 首页 > backend >正文

【TDengine源码阅读】举例说明pthread_once_t和PTHREAD_ONCE_INIT

2025年5月25日,周日上午


以下是一个简单的代码示例,展示如何在Linux中使用pthread_once_t和PTHREAD_ONCE_INIT来确保某个初始化函数只执行一次:

#include <stdio.h>
#include <pthread.h>// 定义once_control变量并初始化为PTHREAD_ONCE_INIT
pthread_once_t once_control = PTHREAD_ONCE_INIT;// 初始化函数,只会被执行一次
void init_function(void) {printf("初始化函数被执行,线程ID: %lu\n", pthread_self());
}// 线程函数
void* thread_func(void* arg) {printf("线程 %lu 进入\n", pthread_self());// 调用pthread_once确保init_function只执行一次pthread_once(&once_control, init_function);printf("线程 %lu 退出\n", pthread_self());return NULL;
}int main() {pthread_t thread1, thread2;// 创建两个线程pthread_create(&thread1, NULL, thread_func, NULL);pthread_create(&thread2, NULL, thread_func, NULL);// 等待线程结束pthread_join(thread1, NULL);pthread_join(thread2, NULL);return 0;
}

代码说明:

pthread_once_t once_control = PTHREAD_ONCE_INIT;  

定义并初始化一个pthread_once_t类型的变量once_control,必须使用PTHREAD_ONCE_INIT宏初始化。

pthread_once(&once_control, init_function);  

调用pthread_once函数,确保init_function只会被执行一次,即使多个线程同时调用。
运行结果

两个线程都会调用pthread_once,但init_function只会被执行一次(由其中一个线程执行),其他线程会等待初始化完成。

输出示例:

线程 128707865867968 进入
线程 128707857475264 进入
初始化函数被执行,线程ID: 128707857475264
线程 128707857475264 退出
线程 128707865867968 退出

适用场景:

多线程环境下需要一次性初始化(如全局变量、单例模式、资源加载等)。

避免重复初始化导致的资源浪费或竞争条件。

http://www.xdnf.cn/news/8762.html

相关文章:

  • STM32 输出比较输出PWM控制呼吸灯小实验(2种实现 铁头山羊与江协科技)
  • Ansible安装
  • C++面向对象编程实战:继承与派生全解析
  • A2A与MCP:差异、协同及企业级应用解析
  • 实战设计模式之访问者模式
  • Javase 基础加强 —— 07 File
  • 云原生安全基石:Linux进程隔离技术详解
  • 2025最新智能优化算法:野燕麦优化算法(Animated Oat Optimization Algorithm, AOO),MATLAB代码
  • JavaSE核心知识点03高级特性03-04(Lambda表达式)
  • 产品迭代与放弃的判断:MVP、PMF 与 Scale Fit 的三重验证
  • VS编码访问Mysql数据库
  • 数据库范式
  • 易贝平台关键字搜索技术深度解析
  • Lesson 21 Mad or not
  • 2024 CKA模拟系统制作 | Step-By-Step | 4、题目搭建-权限控制RBAC
  • 数据库MySQL进阶
  • 【C++】封装红黑树实现 mymap 和 myset
  • 实现Web网站冷启动的全面指南
  • LeetCode 3362.零数组变换 III:贪心+优先队列+差分数组——清晰题解
  • 天猫平台实时商品数据 API 接入方案与开发实践
  • 【时时三省】Python 语言----字符串,列表,元组,字典常用操作异同点
  • Interviews(访谈):业务分析师的“信息开采器”
  • LangGraph 实战指南:长期记忆管理
  • CMSIS-NN:1.简介
  • 【大模型报错解决】cublasLt ran into an error!
  • 开疆智能Profinet转Profibus网关连接DP-IO模块配置案例
  • 水利水电安全员B证职责
  • SpringBoot入门
  • 快速解决Linux 中yum镜像拉取失败问题
  • 算法题(154):合并果子