设计心得—单次调用的控制
一、单次调用开发者很容易混淆单次调用和单实例两种机制可能觉得二者没有区别。在前面的分析中对单实例也就是唯一对象的处理进行过实现分析而且其中的实施也使用了单次调用的方法。单次调用不仅可以用在生成单实例上也可以用在普通的多实例上。单次调用的价值在于对外不会产生副作用无论从形式上或内容上都保持了正常开发的调用机制但达到了只进行唯一一次调用的过程。单次调用的应用场景非常丰富比如常见的单实例、多线程的安全调用以及在某些特殊平台上的接口单一控制如硬件的初始化等等。二、为什么需要单次调用C中处理单次调用的目的主要有以下几个减少重复调用提高效率防止多线程出现多次调用产生竞态导致状态的不稳定进而引发程序的异常重复初始化导致的配置异常导致运行结果的问题硬件平台不支持重复初始化可能导致软、硬件异常设计模式如单实例的需要单次调用某些情况下支持延迟加载提高加载速度架构设计或功能的需要三、C的应对方法在C中要想实现单次调用的方式其实非常简单。当然这是指在较新的C标准情况下。一般来说推荐使用的方法主要有std::call_once这是推荐的使用方法通过std::call_once和std::once_flag配合可以达到对接口的单次调用的目的懒汉模式。它可以保证在多线程调用的情况下接口只被调用一次。这也是创建单实例的一重要方式。它的优势在于全方位的操作能力容易维护但对标准要求稍高C11及以后。显式的全局调用这种情况一般只在程序启动时调用一次接口以后则不再允许调用饿汉模式。这种情况涉及不到多线程也涉及不到复杂的调用操作简单便于维护管理。但缺点也比较明显无法防止开发者重复、忽略调用。这更像是一种业务逻辑的控制而非技术层面的控制。局部或inline静态调用局部静态调用这个在C11后已经由编译器保证了多线程的安全性在C17后的inline静态变量也提供了类似的机制。区别在于局部静态变量标准是保证其初始化的多线程安全的而inline静态变量则只保证全局的唯一性而无法保证多线程的安全初始化。也就是说它更适合于显式的全局调用中使用。这类机制的缺点在于无法进行顺利的动态沟通包括初始化出现问题的异常处理都存在着风险。使用同步操作包括使用互斥锁或使用原子锁以及类似智能指针的引用计数器控制都可以实现单次调用的目的但操作复杂效率较低还容易出现各种细节的处理问题。四、实例根据上面的情况给出几个例程非常简单//call once#includemutex#includethreadstd::once_flag flag_;voidoneInit(){// 只执行一次std::coutcall once!std::endl;}voidthreadFunc(){std::call_once(flag_,oneInit);}//局部静态变量Demo*callOnceOp(){//处理returnpDemo;}voidoneStaticFunc(){staticDemo*pcallOnceOp();}//inline静态class CallOnceDemo{public:staticinlineCallOnceDemoins[]()-CallOnceDemo{staticCallOnceDemo obj;returnobj;}();};重点是把代码与分析对应而不是简单的看这些简单的代码。五、总结为什么强调要把基础打扎实因为这是为后来将多种技术点融合的一个重要前提。正如战场技击拳打还是脚踢其具体到每个动作招式都是一样的但每次的对手和环境不同那么出手的先后顺序和应对方式都有所不同。这就需要每个人能灵活的判断当前的具体情况到底采用哪种技击的招式。僵化的使用招式结果就只能是挨打。明白这个道理也就明白了开发中为什么每个功能的实现后面会跟着多种实现的机制而每种实现机制又不只是单纯为这种功能服务的原因了。

相关新闻

报错解决 OSError: sndfile library not found

报错解决 OSError: sndfile library not found

解决linux系统下 import soundfile 报错 OSError: sndfile library not found 虚拟环境中包的版本: python3.8.20 soundfile0.10.3.post1 librosa0.8.1 报错: 报错原因:查看soundfile官网手册,发现缺少 libsndfile 安装命令&a…

2026/7/4 21:43:44 阅读更多 →
台达B系列触摸屏直接通讯三菱E700变频器程序资料 不需要plc,通过台达触摸屏可以直接控制和...

台达B系列触摸屏直接通讯三菱E700变频器程序资料 不需要plc,通过台达触摸屏可以直接控制和...

台达B系列触摸屏直接通讯三菱E700变频器程序资料 不需要plc,通过台达触摸屏可以直接控制和监控变频器,其它变频器支持modbus rtu协议也可实现。 方法是一样的,只是通讯地址不同。 包括触摸屏程序,变频器参数设置,通讯接线。 标题&…

2026/5/17 2:45:05 阅读更多 →
哪些因素在损害孩子们的视力,做调节训练有用吗?

哪些因素在损害孩子们的视力,做调节训练有用吗?

‍  是不是每次孩子写作业时,你都会忍不住提醒“把头抬起来”?是不是体检报告上,孩子的视力数值一次比一次低,让你满心焦虑?如今,我国儿童青少年近视率依然徘徊在50%左右,近视低龄化的趋势也未…

2026/5/17 2:45:03 阅读更多 →

最新新闻

Thrift接口测试与性能分析:Team IDE的高级功能详解

Thrift接口测试与性能分析:Team IDE的高级功能详解

Thrift接口测试与性能分析:Team IDE的高级功能详解 【免费下载链接】teamide Team IDE 集成MySql、Oracle、金仓、达梦、神通等数据库、SSH、FTP、Redis、Zookeeper、Kafka、Elasticsearch、Mongodb、小工具等管理工具 项目地址: https://gitcode.com/gh_mirrors/…

2026/7/5 17:01:06 阅读更多 →
BTTV安卓版性能优化指南:提升应用流畅度的10个技巧

BTTV安卓版性能优化指南:提升应用流畅度的10个技巧

BTTV安卓版性能优化指南:提升应用流畅度的10个技巧 【免费下载链接】bttv A mod of the Twitch Android Mobile App adding BetterTTV, FrankerFaceZ and 7TV emotes 项目地址: https://gitcode.com/gh_mirrors/bt/bttv BTTV安卓版是一款为Twitch移动应用添加…

2026/7/5 16:59:06 阅读更多 →
如何贡献cs-wiki:开发者参与开源项目的详细步骤与技巧

如何贡献cs-wiki:开发者参与开源项目的详细步骤与技巧

如何贡献cs-wiki:开发者参与开源项目的详细步骤与技巧 【免费下载链接】cs-wiki 📙 致力打造完善的后端知识体系. Not only an Interview-Guide, but also a Learning-Direction. 项目地址: https://gitcode.com/gh_mirrors/cs/cs-wiki cs-wiki 是…

2026/7/5 16:59:06 阅读更多 →
Twitter API Client实战:构建自动化Twitter机器人全攻略

Twitter API Client实战:构建自动化Twitter机器人全攻略

Twitter API Client实战:构建自动化Twitter机器人全攻略 【免费下载链接】twitter-api-client A user-friendly Node.js / JavaScript client library for interacting with the Twitter API. 项目地址: https://gitcode.com/gh_mirrors/twi/twitter-api-client …

2026/7/5 16:55:06 阅读更多 →
HyperDB入门指南:5分钟快速上手分布式数据库

HyperDB入门指南:5分钟快速上手分布式数据库

HyperDB入门指南:5分钟快速上手分布式数据库 【免费下载链接】hyperdb Distributed scalable database 项目地址: https://gitcode.com/gh_mirrors/hyp/hyperdb HyperDB是一款分布式可扩展数据库,它以文件系统的隐喻构建,让开发者能够…

2026/7/5 16:53:05 阅读更多 →
【Bug已解决】Codex CLI 报错 EMFILE: too many open files 解决方案

【Bug已解决】Codex CLI 报错 EMFILE: too many open files 解决方案

【Bug已解决】Codex CLI 报错 EMFILE: too many open files 解决方案 1. 问题描述 让 Codex 处理一个规模较大的项目(比如文件数量众多的 monorepo)时,任务执行到某个阶段突然崩溃,报出文件描述符耗尽的错误: Error: E…

2026/7/5 16:53:05 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻