有时候我们需要对一些posix变量只进行一次初始化,如果进行多次初始化程序就会出现错误。单线程比较容易,但是在多线程程序设计中,事情就变的复杂的多。
如果我们需要对一个posix变量静态的初始化,可使用的方法是用一个互斥量对该变量的初始话进行控制。但有时候我们需要对该变量进行动态初始,pthread_once就会方便的多。
函数原形:
pthread_once_t once_control=PTHREAD_ONCE_INIT;
int pthread_once(pthread_once_t *once_control,void(*init_routine)(void));
参数:
once_control 控制变量
init_routine 初始化函数
返回值:
若成功返回0,若失败返回错误编号。
代码示例:
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
pthread_once_t once=PTHREAD_ONCE_INIT;
pthread_mutex_t mutex;
void once_init_routine(void)
{
int status;
status=pthread_mutex_init(&mutex,NULL);
if(status==0)
{
printf("Init success!,My id is %u",pthread_self());
}
}
void *child_thread(void *arg)
{
printf("Iam child ,My id is %u\n",pthread_self());
pthread_once(&once,once_init_routine);
}
int main(int argc,char *argv[ ])
{
pthread_t child_thread_id;
pthread_create(&child_thread_id,NULL,child_thread,NULL);
printf("Iam main,my id is %u\n",pthread_self());
sleep(1);
pthread_once(&once,once_init_routine);
pthread_join(child_thread_id,NULL);
}
结果: