Linux下pthread_once()函数

pthread_once与线程安全的单例模式 阅读详情

函数声明

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

本函数使用初值为PTHREAD_ONCE_INIT的once_control变量保证init_routine()函数在本进程执行序列中仅执行一次。

例子

#include <semaphore.h>
#include <sys/types.h>
#include <dirent.h>
#include <pthread.h>
#include <errno.h>
#include <signal.h>
#include <time.h>

pthread_once_t once = PTHREAD_ONCE_INIT;

void once_run(void)
{
    printf("once_run in thread %u\n", pthread_self());
}

void* task1(void* arg)
{
    int tid = pthread_self();
    printf("thread1 enter %u\n", tid);
    pthread_once(&once, once_run);
    printf("thread1 returns %u\n", tid);

    return NULL;
}

void* task2(void* arg)
{
    int tid = pthread_self();
    printf("thread2 enter %u\n", tid);
    pthread_once(&once, once_run);
    printf("thread2 returns %u\n", tid);

    return NULL;
}

int main(int argc, char *argv[])
{
    pthread_t thrd1, thrd2;

    pthread_create(&thrd1, NULL, (void*)task1, NULL);
    pthread_create(&thrd2, NULL, (void*)task2, NULL);

    sleep(5);
    printf("Main thread exit...\n");

    return 0;
}

从以上例子可以看出,虽然pthread_create分别创建了task1和task2两个不同的线程,但是由于每个task内部都通过pthread_once函数来调用的once_run(),所以打印语句最终只走一次,而不是两次。运行结果如下:

[root@robot ~]# ./thread_once
thread2 enter 3067722608
once_run in thread 3067722608
thread2 returns 3067722608
thread1 enter 3078212464
thread1 returns 3078212464
Main thread exit...
[root@robot ~]# 

适用范围

这种情况一般用于某个多线程调用的模块使用前的初始化,但是无法判定哪个线程先运行,从而不知道把初始化代码放在哪个线程合适的问题。
当然,我们一般的做法是把初始化函数放在main里,创建线程之前来完成,但是如果我们的程序最终不是做成可执行程序,而是编译成库的形式,那么main函数这种方式就没法做到了。

基本原理

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

转载文章地址:

http://bbs.chinaunix.net/thread-836577-1-1.html
https://www.cnblogs.com/Robotke1/archive/2013/05/02/3053958.html

Microsoft Defender防病毒扫描添加排除项 Win10与Win11上的“**Microsoft Defender防病毒**”功能默认会自动扫描所有非压缩文件,如果发现病毒或疑似病毒甚至经过手动修改后某些安装文件,会自动将其删除,如果是后面两种情况,则可能会造成误报,对我们正常办公或学习造成不利影响。 此时, 我们可以将某个目录或文件设置为“**Microsoft Defender防病毒不会扫描已排除的项目**”(<red>但要注意:这些被排除的目录或文件会给笔记本造成一定的安全风险,如果真有病毒感染这些目录或文件它们也不会被“**Micr 阅读详情

相关推荐

cst-python联合仿真的问题解决

cst与python联合仿真出现无法调用CST的问题解决

ayihu_的博客 2373

pthread_once使用 -- 仅初始化一次

文章目录1、函数原型:2、pthread_once_t、PTHREAD_ONCE_INIT定义3、代码实例:4、应用 & 参考 1、函数原型: int pthread_once(pthread_once_t *once_control, void (*init_routine)(void)); pthread_once的作用为,在给定once_control的情况下,在整个程序中仅调用一次init_routine(在多线程中具体哪一个线程执行不一定)。如果再次调用,pthread_once将不会调

Donald Su 2985

Java 多线程(1)---- 初识线程

前言 多线程想必大家都不会陌生。因为在日常使用和开发中,多线程的使用实在是太常见了。我们都知道,发明多线程的目的是为了更好的利用计算机的 CPU 资源。比如在一个进程中如果只有一个线程(也叫主线程),那么如果当这个线程因为某种原因阻塞(等待用户输入数据等情况)的时候,那么相对应的这个进程也让出了 CPU 资源并暂停执行了。试想一下,如果我们在一个进程中添加多个线程,那么当这个进程中某个线程阻塞的...

指点 1544

C语言之pthread_once实例总结(八十三)

本篇目的:理解pthread_once函数用法函数是POSIX线程库中的一个函数,用于在单线程环境中进行线程安全的初始化。该函数确保仅在第一次调用时执行给定的初始化代码,而不会重复执行。这对于需要在程序启动时进行初始化,但只执行一次的操作非常有用。函数保证函数在多线程环境下只被调用一次。是一个用来控制函数是否被调用的控制变量。是需要保证只调用一次的函数。如果函数成功执行,返回0。如果函数失败,返回一个非零值。使用。

Android系统攻城狮 1202

Autoware.universe部署03:与Carla(二进制版)联调

本文介绍了 Autoware.universe 与 Carla 二进制版的联调过程。Autoware.universe 是一个开源的自动驾驶软件平台,而 Carla 则是一个用于自动驾驶仿真的开源工具。将这两者联调起来可以在仿真环境中测试和验证 Autoware.universe 的功能和性能,为自动驾驶系统的开发和测试提供有力支持。

zardforever123的博客 7368

从Delta Delay到Timing Window:详解数字芯片后端时序差异的那些坑

本文深入剖析了数字芯片后端设计中,模块级与系统级时序分析结果不一致的核心原因。重点解释了Delta Delay如何导致模块级分析的乐观假设,以及Timing Window(时序窗口)差异如何通过影响串扰噪声计算,在顶层集成时引发新的时序违例,尤其是保持时间问题。文章为工程师提供了从约束建模到签核策略的系统性应对方案。

beer8的博客 499

pthread_once()函数详解

线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。 现在,多线程技术已经被许多操作系统所支持,包括Windows/NT,当然,也包括Linux。 为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些

tianmo2010的专栏 2011

从GAN生成失败案例出发:为什么你的AI画不准位置?CoordConv保姆级解决方案

本文深入探讨了GAN生成图像时位置偏移问题的根源,并提供了CoordConv的保姆级解决方案。通过分析传统CNN在空间坐标建模上的缺陷,详细介绍了CoordConv的原理、实现步骤及在StyleGAN2等模型中的实战应用,显著提升了医学图像生成等任务的定位精度。

pp12345的博客 204

pthread_once函数的作用是什么

由于 config_once 被初始化为 PTHREAD_ONCE_INIT,pthread_once 会知道 init_config 还没有被调用过,因此它会执行 init_config 函数,并将 config_once 的值设置为非零,以表示 init_config 已经执行过了。pthread_once_t *once_control 是一个指向 pthread_once_t 类型变量的指针,这个变量被用作控制变量,以确保初始化函数只被执行一次。// 初始化函数,用于读取配置文件。

slty_123的博客 1065

Android 车联网——CarAudioService介绍(六)

CarAudioService 是 Android Automotive OS 中的一个重要组件,用于管理车辆中的音频功能。它是 Android Auto 的一部分,负责处理车辆音频的播放、控制和路由。CarAudioService 使用标准的 Android 组件架构,基于 Binder 通信机制,提供了一组 API,用于管理车辆音频。它包括以下主要功能:音频路由管理:CarAudioService 可以让开发者控制音频的路由,即将音频发送到不同的输出设备,例如车辆的扬声器、耳机等。

小旭的专栏 3202

【数据分析八步法】将模糊需求转化为可验证的分析问题

国内访问Huggingface官方源常遇网络问题,可通过切换国内镜像提升下载速度。三种配置方式:1)设置HF_ENDPOINT环境变量;2)在from_pretrained中直接指定镜像参数;3)修改本地Huggingface配置文件。常用镜像包括hf-mirror.com、阿里云ModelScope和清华镜像源。注意镜像同步延迟、私有模型限制,建议配合huggingface-cli工具使用,必要时取消代理设置。合理配置镜像源可显著改善Huggingface生态使用体验。

Mr数据杨 858

pthread_once_t 类型 和 pthread_once 函数

1. 测试代码 2. 运行结果, 达到目的. 3. 代码分析 3.1 pthread_once_t 就是个李鬼, 它就是int 类型 3.2. pthread_once 是libc 的库函数, 如同pthread_create, pthread_join 函数一样.

hjjdebug的专栏 914

30. 用GPT-4自动生成测试用例的完整流程

利用GPT - 4生成测试用例面临的主要问题包括:如何准确地将软件需求转化为GPT - 4能够理解的输入提示,以确保生成的测试用例覆盖所有关键功能;如何评估生成的测试用例的有效性和充分性;如何处理生成的测试用例中的错误或不合理之处;以及如何将生成的测试用例集成到现有的测试框架中。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 472

(转载)Linux下pthread_once()函数

(转载)http://bbs.chinaunix.net/thread-836577-1-1.html 仅执行一次的操作int pthread_once(pthread_once_t *once_control, void (*init_routine) (void))本函数使用初值为PTHREAD_ONCE_INIT的once_control变量保证init_routine()函数在本进程执行...

weixin_30416871的博客 184

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【Linux 多线程】pthread_once

Linux下pthread_once()函数_老王的技术博客-优快云博客

老农民娃哈哈的博客 546

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

linux学习之十三---多线程的创建

多线程的创建 在Linux下线程的创建通过函数pthread_create来完成,该函数的声明如下: #include int pthread_create(pthread_t *thread, pthread_attr_t *attr,void*(*start_routine)(void*),void *arg); 函数各参数含义如下: thread:该参数是一个指针,档线程创

lanzh_ 1053

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Posix线程编程指南(5)

原文地址:http://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part5/ 获得本线程ID pthread_t pthread_self(void) 本函数返回本线程的标识符。 在LinuxThreads中,每个线程都用一个pthread_descr结构来描述,其中包含了线程状态、线程I...

云计算? 79

linux多进程.doc,linux多线程与多进程.doc

linux多线程与多进程.doc还剩16页未读,继续阅读下载文档到电脑,马上远离加班熬夜!亲,喜欢就下载吧,价低环保!内容要点:pthread_once(&once,once_run);printf("thread %d returns\n",tid);}int main(void){int tid1,tid2;printf("hello\n");pthread_create(&t...

weixin_32829465的博客 124

【C++】实现单例模式 [懒汉模式、饿汉模式]

单例模式:保证一个类只被实例化一次!单例模式有懒汉和饿汉两种模式; 懒汉模式:第一次用到类的时候再去实例化;适合在访问量较小的时候使用; 【时间换空间,懒汉模式本身是线程不安全的!】 饿汉模式:类定义的时候就初始化;由于要进行线程同步,所以在访问量较大或可能访问的线程较多的情况下使用 【空间换时间,安全!】 < 饿汉...

欢迎来到Aff ''的QQ空间 545

C++线程安全的单例模式

在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式。单例模式分为懒汉模式,跟饿汉模式两种。 1.饿汉模式的实现: template <class T> class singleton { protected: singleton(){}; private: singleton(const singleton&...

paradox_1_0的博客 316

linux-线程使用

linux-线程使用 分类: Linux下C编程 2008-05-20 10:26 276人阅读 评论(0) 收藏 举报 线程创建 1.1线程与进程 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。 线程和进

jxj_xue的专栏 886

Posix线程编程小技巧

http://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part5/ 简介: 这是一个关于Posix线程编程的专栏。作者在阐明概念的基础上,将向您详细讲述Posix线程库API。本文是第五篇将向您讲述pthread_self()、pthread_equal()和pthread_once()等杂项函数。 在P

cjsycyl的专栏 530

linux下多进程、多线程编程

linux下进程 (一) 理解Linux下进程的结构 Linux下一个进程在内存里有三部份的数据,就是“数据段”,“堆栈段”和“代码段”,其实学过汇编语言的人一定知道,一般的CPU象I386,都有上述三种段寄存器,以方便操作系统的运行。“代码段”,顾名思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。 堆栈段存放的就...

weixin_30314631的博客 81
上一篇: FFmpeg庖丁解牛系列之dict模块
下一篇: 关于媒体编解码以及封装那点事
ericbars
博客等级 码龄10年 120粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值