在多线程环境中使用pthread_once函数初始化全局资源

文章介绍了POSIX线程库中的pthread_once函数,用于在多线程环境下保证全局资源仅初始化一次。通过once_control参数确保同一函数只执行一次,以防止资源重复初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

在多线程环境中,需要确保全局资源只被初始化一次。

解决方案

POSIX线程库提供了一个名为 pthread_once 的函数,可以在多线程环境下,确保某个函数只被调用一次。函数原型如下:

#include <pthread.h>

int pthread_once(pthread_once_t *once_control, void (*init_routine)(void));
pthread_once_t once_control = PTHREAD_ONCE_INIT;

参数:

  • once_control,我们一般设置为 PTHREAD_ONCE_INIT
  • init_routine ,函数指针,指向参数为 void、返回值为 void 的函数;

返回值:

成功返回0,错误返回一个错误码表示出错类型;


pthread_once 函数第一次调用时,会执行传入的 init_routine 函数,之后的任意次调用,只要传入的 once_control 参数相同,init_routine 函数就不会被执行;在 pthread_once 第一次调用成功返回时,init_routine 已经执行完成。

一个简单的示例如下,是我在学习 muduo 网络库和 linux 服务器编程中看到过的,在此记录下来。

示例代码来自 https://github.com/linyacool/WebServer

static pthread_once_t once_control_ = PTHREAD_ONCE_INIT;
// 静态全局对象,应该在整个程序的生命周期中只被初始化一次
static AsyncLogging *AsyncLogger_;

void once_init()
{
    AsyncLogger_ = new AsyncLogging(Logger::getLogFileName());
    AsyncLogger_->start(); 
}

void output(const char* msg, int len)
{
    pthread_once(&once_control_, once_init);
    AsyncLogger_->append(msg, len);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值