pthread_once 一般用于一次性的线程初始化,在整个声明周期中,该方法只执行一次,从而实现一种线程安全的单例模式。

Pthread_once () 函数语法要点
头文件 : #include<pthread.h>

函数原型 : int pthread_once(pthread_once_t *once_control, void(*int_routine)(void));

once_control : 一个静态或全局变量,初始化为 PTHREAD_ONCE_INT

init_routine : 初始化函数的函数指针

返回值:成功: 0   错误:错误码

LinuxThreads使用互斥锁和条件变量保证由pthread_once()指定的函数执行且仅执行一次,而once_control则表征是否执 行过。如果once_control的初值不是PTHREAD_ONCE_INIT(LinuxThreads定义为0),pthread_once() 的行为就会不正常。在LinuxThreads中,实际"一次性函数"的执行状态有三种:NEVER(0)、IN_PROGRESS(1)、DONE (2),如果once初值设为1,则由于所有pthread_once()都必须等待其中一个激发"已执行一次"信号,因此所有pthread_once ()都会陷入永久的等待中;如果设为2,则表示该函数已执行过一次,从而所有pthread_once()都会立即返回0。

[root@localhost 06]# cat pthread3.cpp
#include<iostream>
#include<pthread.h>
using namespace std;

pthread_once_t once = PTHREAD_ONCE_INIT;

void once_run(void)
{
        cout<<"once_run in thread "<<(unsigned int )pthread_self()<<endl;
}

void * child1(void * arg)
{
        pthread_t tid =pthread_self();
        cout<<"thread "<<(unsigned int )tid<<" enter"<<endl;
        pthread_once(&once,once_run);
        cout<<"thread "<<tid<<" return"<<endl;
}

void * child2(void * arg)
{
        pthread_t tid =pthread_self();
        cout<<"thread "<<(unsigned int )tid<<" enter"<<endl;
        pthread_once(&once,once_run);
        cout<<"thread "<<tid<<" return"<<endl;
}

int main(void)
{
        pthread_t tid1,tid2;
        cout<<"hello"<<endl;
        pthread_create(&tid1,NULL,child1,NULL);
        pthread_create(&tid2,NULL,child2,NULL);
        sleep(10);
        cout<<"main thread exit"<<endl;
        return 0;

}
[root@localhost 06]# g++ -lpthread pthread3.cpp -o pthread3
[root@localhost 06]# ./pthread3
hello
thread 3086535584 enter
once_run in thread 3086535584
thread 3086535584 return
thread 3076045728 enter
thread 3076045728 return

例子:muduo 网络库的 Singleton 就用到了 pthread_once。

template<typename T>
class Singleton : boost::nocopyable{
public:static T& instance(){pthread_once(&ponce_,&Singleton::init);         // 保证ponce_只会被执回调执行一次Singleton::initreturn *value_;}
private:Singleton();~Singleton();static void init(){value_ = new T();}
private:static pthread_once_t ponce_;static T* value_;
};// 必须在头文件中定义static 变量template<typename T>
pthread_once_t Singleton<T>::ponce_ = PTHREAD_ONCE_INIT;
template<typename T>
T* Singleton<T>::value_ = NULL;

注意事项
在使用 pthread_once () 函数时需要注意,不能在其回调函数中调用 fork (),否则,当再次调用 pthread_once () 时,会在子进程中导致死锁。而且,不能在回调函数中抛出一个 C++异常。

Linux--pthread_once 的用法相关推荐

  1. Linux下wine用法

    Linux下wine用法 下面是wine的使用方法. 一.要在Linux下运行,wine是必不可少的,所以,请将wine安装到你的系统里. 二.将你的Windows所在的分区加载到某个目录.(本文假定 ...

  2. linux md5sum 的用法(转)

    MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一个二进制长度 ...

  3. Linux export 命令用法

    Linux export 命令用法 Linux export 命令用于设置或显示环境变量. 在 shell 中执行程序时,shell 会提供一组环境变量.export 可新增,修改或删除环境变量,供后 ...

  4. Linux epoll的用法

    Linux epoll的用法 epollfd_create函数 #include <sys/epoll.h>int epoll_create (int __size) 参数 含义 __si ...

  5. Linux中find用法整理

    一.Linux中find常见用法示例 ·find    path    -option    [    -print ]    [ -exec    -ok    command ]    {} /; ...

  6. Linux cat 命令用法

    cat主要有三大功能: 1.一次显示整个文件. $ cat filename 2.从键盘创建一个文件. $ cat > filename 只能创建新文件,不能编辑已有文件. 3.将几个文件合并为 ...

  7. c语言strTrimed函数用法介绍,linux type命令用法_转

    在脚本中type可用于检查命令或函数是否存在,存在返回0,表示成功:不存在返回正值,表示不成功. $ type foo >/dev/null 2>&1 || { echo > ...

  8. linux signal用法,Linux 信号 signal 用法详解及注意事项

    Linux 信号 signal 用法详解及注意事项 1) SIGHUP 本信号在用户终端连接 (正常或非正常) 结束时发出, 通常是在终端的控 制进程结束时, 通知同一 session 内的各个作业, ...

  9. linux下rdesktop用法

    我自己用的参数rdesktop -g workarea -D -r clipboard:PRIMARYCLIPBOARD -a 16 -x lan 192.168.1.2 rdesktop是Linux ...

  10. Linux中EOF用法

    Linux中EOF用法 理解:EOF是END Of File的缩写,表示自定义终止符.既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d就代表EOF. EOF一般会配合c ...

最新文章

  1. 20018-05-16 第十天
  2. 记录因xen而导致lvs,realserver转发activeconn为0
  3. java怎么给类中的私有变量赋值_Java核心技术笔记分享------第二章 类与对象
  4. Github使用1-入门
  5. 《开源思索集》一如何更有效地学习开源项目的代码?
  6. python测试代码性能_使用python timeit 模块检测代码性能
  7. 开源开放 | DeepKE发布新版本:支持低资源、长篇章、多任务的图谱抽取开源框架(浙江大学)...
  8. String 源码解析
  9. 优达学城深度学习之七——TensorFlow卷积神经网络
  10. 释放Ubuntu/Linux系统cache,增加可用内存空间
  11. vue监听用户点击区域
  12. GDI+绘制的一个Report Designer原型
  13. BDS Business Development Studio
  14. sqlserver一个循环圆的算法
  15. The Biggest Water Problem【牛客网】
  16. 数字电子技术基础(四):门电路(TTL)
  17. Boost Asio快速入门
  18. 2000坐标系xy坐标几位_2000国家大地坐标系
  19. 怎么用计算机圣诞节快乐,【计算机·图文】圣诞节快乐—圣诞节故事
  20. java swing 外观_swing专业外观

热门文章

  1. 那些年啊,那些事——一个程序员的奋斗史 ——69
  2. 好分数班级等级C_2020高中分数线(广州|深圳|天津|广州|南宁|泉州|龙岩|武汉|沈阳|青岛|汉中|长春|四平|北京等)...
  3. PKUSC 2022游记
  4. 解决win10和ubuntu双系统下win10时间偏差的问题
  5. BZOJ #3653. 谈笑风生
  6. Excel实战 第1章 数据处理
  7. Enriched Feature Guided Refinement Network for Object Detection(面向目标检测的丰富特征引导细化网络)
  8. Python制作卡点视频
  9. Mac双系统Win10系统安装MySQL的坑
  10. 微服务系统架构设计系列 - RateLimiter - 1. 限流器简介与一般算法