简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:理解C++的std::call_once用法
2. std::call_once用法介绍
在C++中,std::call_once
函数是一个用于在多线程环境下保证某个任务只执行一次的机制。它可以用来实现线程安全的延迟初始化或者执行一些只需执行一次的全局操作。
3. std::call_once实例
<1>.v1.0 普通实例用法
#include <iostream>
#include <thread>
#include <mutex>
#include <unistd.h>
std::once_flag flag;
void initialize(){
std::cout << "初始化工作..." << std::endl;
sleep(2);
}
void threadFunction(){
std::call_once(flag, initialize);
//其他线程等待第一个线程初始化后,才继续执行,并且多个线程中,initialize只会调用一次.
std::cout << "其他线程继续执行..." << std::endl;
}
int main(){
std::thread t1(threadFunction);
std::thread t2(threadFunction);
t1.join();
t2.join();
return 0;
}
- std::once_flag对象来保证函数initialize只会被调用一次。当多个线程调用threadFunction时,只有一个线程会执行initialize函数,其他线程会在调用std::call_once后等待初始化完成。
<2>.v2.0 lambda表达式用法实例
#include <iostream>
#include <thread>
#include <mutex>
#include <unistd.h>
std::once_flag flag;
void initialize(){
std::cout << "初始化工作..." << std::endl;
sleep(2);
}
void threadFunction(){
//其他线程等待第一个线程初始化后,才继续执行,并且多个线程中,initialize只会调用一次.
//使用lambda表达式实现.
std::call_once(flag, [&](){
initialize();
});
std::cout << "其他线程继续执行..." << std::endl;
}
int main(){
std::thread t1(threadFunction);
std::thread t2(threadFunction);
t1.join();
t2.join();
return 0;
}