当前位置: 首页 > news >正文

c++ call_once 使用详解

c++ call_once 使用详解

std::call_once

  • 头文件 #include <mutex>

  • 函数原型:

    template<class Callable, class... Args>
    void call_once(std::once_flag& flag, Callable&& f, Args&&... args);
    
    • flag:标志对象,用于指示 f 是否已调用过。
    • f:要调用的可调用对象。
    • args:传递给 f 的参数。
  • 作用:保证可调用对象 f 只被执行一次,即使同时从多个线程调用。

  • 注意事项:

    • 如果在调用 std::call_once 的时刻,flag 指示 f 已经调用过,那么 std::call_once 会立即返回。
    • 如果在调用 f 时抛出了异常,那么异常将传播给 std::call_once 的调用方,并且 flag 不会被翻转。
    • 如果调用正常返回,那么 flag 被翻转,并保证以同一 flag 对 std::call_once 的其他调用立即返回。
    • 如果有多个线程同时在 flag 未翻转时调用 std::call_once,那么这些调用将被组成单独全序,并被依次执行。

示例代码

#include <cstdio>
#include <mutex>
#include <thread>std::once_flag flag1, flag2;void simple_do_once()
{std::call_once(flag1, []() { printf("only call once\n"); });
}void may_throw_function(bool do_throw)
{if (do_throw) {printf("throw, try again...\n");throw std::exception();}printf("no throw, call once\n");
}void do_once(bool do_throw)
{try {std::call_once(flag2, may_throw_function, do_throw);} catch (...) {}
}int main()
{std::thread st1(simple_do_once);std::thread st2(simple_do_once);st1.join();st2.join();std::thread t1(do_once, true);std::thread t2(do_once, false);std::thread t3(do_once, true);t1.join();t2.join();t3.join();
}
http://www.lryc.cn/news/236581.html

相关文章:

  • 【rosrun diagnostic_analysis】报错No module named rospkg | ubuntu 20.04
  • 高防CDN有什么作用?
  • 盛元广通开放实训室管理系统2.0
  • 3D建模基础教程:编辑多边形功能命令快捷方式
  • SaleSmartly新增AI意图识别触发器!让客户享受更精准的自动化服务
  • 计算机毕业设计选题推荐-个人博客微信小程序/安卓APP-项目实战
  • 一篇详解,Postman设置token依赖步骤
  • 音频录制实现 绘制频谱
  • nginx代理本地服务请求,避免跨域;前端图片压缩并上传
  • Vue3-readonly(深只读) 与 shallowReadonly(浅只读)
  • 中小企业怎么实现数字化转型?有什么实用的工单管理系统?
  • vue3.x中父组件添加自定义参数后,如何获取子组件$emit传递过来的参数
  • 【Machine Learning in R - Next Generation • mlr3】
  • CorelDraw2024(CDR)- 矢量图制作软件介绍
  • RT-DETR优化改进:轻量级Backbone改进 | VanillaNet极简神经网络模型 | 华为诺亚2023
  • 本地部署 EmotiVoice易魔声 多音色提示控制TTS
  • 5g路由器赋能园区无人配送车联网应用方案
  • ARTS 打卡第一周
  • 第八部分:JSP
  • Github小彩蛋显示自己的README,git 个人首页的 README,readme基本语法
  • dxva2+ffmpeg硬件解码(Windows)终结发布
  • C#密封类、偏类
  • C++菱形继承问题
  • 第20章 数据库编程
  • PS学习笔记——初识PS界面
  • JDBC,Java连接数据库
  • java智慧校园信息管理系统源码带微信小程序
  • 智能电销机器人好做吗?ai机器人有没有用?
  • 吴恩达《机器学习》9-1:代价函数
  • 代码随想录算法训练营第五十九天 | LeetCode 739. 每日温度、496. 下一个更大元素 I