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

C++: std::once_flag 和 std::call_once

std::once_flag 和 std::call_once

std::once_flag 和 std::call_once 是 C++11 引入的同步原语,用于确保某个函数在多线程环境中只被执行一次。它们位于 头文件中,主要用于实现线程安全的初始化操作。

std::once_flag

概述

类型:std::once_flag 是一个结构体,用于记录某个函数是否已经被调用过。
用途:与 std::call_once 配合使用,确保某个函数在多线程环境中只被执行一次。

std::once_flag my_flag;

std::call_once

函数:std::call_once 是一个函数模板,用于确保某个函数在多线程环境中只被执行一次。

参数:
std::once_flag& flag:一个 std::once_flag 对象,用于记录函数是否已经被调用过。

Function&& f:要执行的函数或可调用对象。

Args&&… args:传递给函数的参数。

std::once_flag my_flag;

void initialize() {
    // 初始化代码
}

void some_function() {
    std::call_once(my_flag, initialize);
}

示例代码

以下是一个完整的示例,展示了如何使用 std::once_flag 和 std::call_once 来确保某个函数在多线程环境中只被执行一次:

#include <iostream>
#include <mutex>
#include <thread>

std::once_flag my_flag;

void initialize() {
    std::cout << "Initialization code executed" << std::endl;
}

void thread_function() {
    std::call_once(my_flag, initialize);
}

int main() {
    std::thread t1(thread_function);
    std::thread t2(thread_function);
    std::thread t3(thread_function);

    t1.join();
    t2.join();
    t3.join();

    return 0;
}

底层实现

std::once_flag 和 std::call_once 的底层实现依赖于操作系统提供的同步机制,通常使用互斥锁(mutex)和条件变量(condition variable)来确保线程安全。

std::once_flag

std::once_flag 内部维护一个状态,用于记录函数是否已经被调用过。
这个状态通常是一个原子变量(atomic variable),确保在多线程环境下的操作是原子的。


std::call_once

std::call_once 内部使用一个互斥锁来保护对 std::once_flag 状态的访问。
如果函数尚未被调用,std::call_once 会锁定互斥锁,执行函数,然后更新 std::once_flag 的状态。
如果函数已经被调用,std::call_once 会立即返回,不会再次执行函数。
http://www.dtcms.com/a/12272.html

相关文章:

  • 智能体与在线实用工具:协同并进,提升生活效率
  • 科研绘图系列:R语言PCoA图(PCoA plot)
  • websocket和轮询的区别?
  • RabbitMQ 入门教程
  • 在模板中使用 Django 会话
  • 828华为云征文|华为云Flexus云服务器X实例部署Cockpit服务
  • 【Django-Minio-Storage 使用教程】
  • RabbitMQ核心架构
  • spring boot 项目 prometheus 自定义指标收集区分应用环境集群实例ip,使用 grafana 查询--方法耗时分位数指标
  • RK3588平台开发系列讲解(显示篇)图像的宽高和跨距
  • Linux之grafana+onealert报警
  • 回调函数的概念及其在异步编程中的应用
  • React基础教程(09):react的属性介绍(props)
  • pr瘦脸怎么操作?
  • Python sys 库的应用实例
  • 达梦数据库的系统视图v$sysstat
  • 人工智能造福公众:未来一片光明
  • 学习计算机网络
  • Seata 分布式事务控制
  • Axure设计效率提升:实战策略与技巧
  • ChatGPT 3.5/4.0使用手册:解锁人工智能的无限潜能
  • 前端面试笔记(三)--(基础知识篇sz)
  • 基于RK3568平台移植ffmpeg3.4.5及ffmpeg验证
  • AMP网站的SEO 关于“备用网页”应该如何处理?
  • 计算机毕业设计 半成品配菜平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 秋招突击——算法练习——8/26——图论——200-岛屿数量、994-腐烂的橘子、207-课程表、208-实现Trie
  • 双向链表
  • 浅谈DevOps在inBuilder低代码中的应用
  • yosys-f4pga-plugin编译教程
  • 新考纲下的PMP考试有多难?