问题
在多线程环境中,需要确保全局资源只被初始化一次。
解决方案
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);
}