首页 > 其他分享 >并发支持库:多线程中的std::call_once单次调用

并发支持库:多线程中的std::call_once单次调用

时间:2024-03-14 15:49:01浏览次数:28  
标签:std 多线程 flag call include once

std::call_once

中定义

template< class Callable, class... Args >
void call_once( std::once_flag& flag, Callable&& f, Args&&... args );

确保函数或者代码片段在在多线程环境下,只需要执行一次。

常用的场景如Init()操作或一些系统参数的获取等。

此函数在 POSIX 中类似 pthread_once

使用案例

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

std::once_flag flag;

void Initialize()
{
	std::cout << "Run into Initialize.." << std::endl;
}

void Init()
{
	std::call_once(flag, Initialize);
}

int main()
{
	std::thread t1(Init);
	std::thread t2(Init);
	std::thread t3(Init);
	std::thread t4(Init);
	t1.join();
	t2.join();
	t3.join();
	t4.join();
}

std::once_flag

std::once_flagstd::call_once 的辅助类。

note:std::once_flag 既不可复制亦不可移动。

once_flag的生命周期必须要比使用它的线程的生命周期要长

标签:std,多线程,flag,call,include,once
From: https://www.cnblogs.com/getonechao/p/18072981

相关文章

  • volatile关键字是如何确保多线程环境下变量的可见性和有序性
    VOLATILE关键字在JAVA中用于确保多线程环境下的变量可见性和一定程度的有序性,其具体实现机制基于JAVA内存模型(JAVAMEMORYMODEL,JMM):可见性:当一个线程修改了标记为volatile的共享变量时,它会强制将这个变量值从当前线程的工作内存刷新回主内存。同时,其他线程在读取该volatil......
  • 多线程系列(十九) -Future使用详解
    一、摘要在前几篇线程系列文章中,我们介绍了线程池的相关技术,任务执行类只需要实现Runnable接口,然后交给线程池,就可以轻松的实现异步执行多个任务的目标,提升程序的执行效率,比如如下异步执行任务下载。//创建一个线程池ExecutorServiceexecutor=Executors.newFixedThreadPool......
  • Java多线程&并发篇2024
    目录Java全技术栈面试题合集地址Java多线程&并发篇1.volatile能使得一个非原子操作变成原子操作吗?2.volatile修饰符的有过什么实践?3.volatile类型变量提供什么保证?4.Java中怎么获取一份线程dump文件?5.什么是线程局部变量?6.Java中sleep方法和wait方法的区别?7.......
  • windbg 调试 c++ std::exception
    由于c++std::exception在windbg里面调用堆栈显示不正确,可以通过加载了系统pdb和软件pdb后,!analyze-v可以分析出来,所有需要配置系统pdb。1、把exe,pdb放到同一个目录下。2、加载dmp文件(拖动dmp文件到windbg)。3、设置pdb路径:File->SymbolFilePath,比如D:\Desktop\3dLayer,记得加......
  • C# 实现Thread多线程
    在C#中,可以使用Thread类来实现多线程编程。多线程是同时执行多个任务的一种方式,每个任务在一个独立的线程中运行,有着各自的执行流和上下文。使用多线程的场景:需要同时执行多个耗时的任务,以提高程序的响应性能。需要处理实时数据,比如即时通讯、数据流处理等。需要并行执行......
  • python多线程中:如何关闭线程?
    使用threading.Event对象关闭子线程Event机制工作原理:Event是线程间通信的一种方式。其作用相当于1个全局flag,主线程通过控制event对象状态,来协调子线程步调。使用方式主线程创建event对象,并将其做为参数传给子线程主线程可以用set()方法将event对象置为true,用cl......
  • JAVA的多线程及并发
    1.Java中实现多线程有几种方法继承Thread类;实现Runnable接口;实现Callable接口通过FutureTask包装器来创建Thread线程;使用ExecutorService、Callable、Future实现有返回结果的多线程(也就是使用了ExecutorService来管理前面的三种方......
  • 深入浅出Java多线程(十二):线程池
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十二篇内容:线程池。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在现代软件开发中,多线程编程已经成为应对高并发、高性能场景的必备技术。随着计算机硬件的发展,尤其是多核CPU的普及,利用多线程能够......
  • vagrant up 启动报错 Stderr: VBoxManage.exe: error: A NAT rule of this name alrea
    报错:使用vagrantup启动VirtualBox虚拟机时报错:Stderr:VBoxManage.exe:error:ANATruleofthisnamealreadyexistsVBoxManage.exe:error:Details:codeE_INVALIDARG(0x80070057),componentNATEngineWrap,interfaceINATEngine,calleeIUnknownVBoxManage.exe:e......
  • 多线程系列(十八) -AQS原理浅析
    一、摘要在之前的文章中,我们介绍了ReentrantLock、ReadWriteLock、CountDownLatch、CyclicBarrier、Semaphore、ThreadPoolExecutor等并发工具类的使用方式,它们在请求共享资源的时候,都能实现线程同步的效果。在使用方式上稍有不同,有的是独占式,多个线程竞争时只有一个线程能执......