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

【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.dtcms.com/a/211770.html

相关文章:

  • PPT连同备注页(演讲者模式)一块转为PDF
  • 深入浅出IIC协议 - 从总线原理到FPGA实战开发 -- 第六篇:AXI4-Lite桥接设计
  • 鸿蒙仓颉开发语言实战教程:页面跳转和传参
  • Java多线程JUC
  • 2025.05.23 Axure 动态面板学习笔记
  • Linux 的编辑器--vim
  • Apache 高级配置实战:从连接保持到日志分析的完整指南
  • 对WireShark 中的UDP抓包数据进行解析
  • Php JIT 使用详解
  • 从智能提效到产品赋能的架构实践
  • 【HW系列】—web常规漏洞(SQL注入与XSS)
  • RocketMQ 5.0 核心概念与架构解析
  • python | vscode | 使用uv快速创建虚拟环境(实现一个项目一个虚拟环境,方便环境管理)
  • 【排序算法】典型排序算法和python 实现
  • 前端流行框架Vue3教程:28. Vue应用
  • 【排序算法】典型排序算法 Java实现
  • 基于opencv的全景图像拼接
  • CSS传统布局与定位详解与TDK三大标签SEO优化
  • Java 8 Stream操作示例
  • Redis 3.0~8.0特性与数据结构全面解析
  • Android-flutter学习总结
  • 云迹机器人底盘调用
  • 高可用 Redis 服务架构分析与搭建
  • 03. C#入门系列【变量和常量】编程世界里的“百变魔盒”与“永恒石碑”
  • 刚入门3DGS的新手小白能够做的工作
  • Vue3 watch 使用与注意事项
  • C++复习核心精华
  • 本地处理 + GPU 加速 模糊视频秒变 4K/8K 修复视频老旧素材
  • 09_模型训练篇-卷积(上):如何用卷积为计算机“开天眼”?
  • [项目总结] 基于Docker与Nginx对项目进行部署