有时候咱们须要的变量(variable)容器(container)只须要初始化一次,以容器(containter)为例子,可能只是须要向其中注入一次元素.ios
只打C++11开始标准库提供了std::call_once()和std::once_flag的组合能够帮助咱们作到这一点.code
demo1:it
#include <iostream> #include <thread> #include <mutex> #include <vector> std::vector<int> vec; std::mutex mutex; std::once_flag flag; static int val = 0; void initialized_vec(std::vector<int>& vec) { for (int i = 0; i < 10; ++i) { vec.push_back(val++); } } void print_vec() { std::call_once(flag, initialized_vec, vec); std::lock_guard<std::mutex> auto_lock(mutex); for (const int& number : vec) { std::cout << number << " "; } std::cout << std::endl; } int main() { std::thread threads[5]; for (int i = 0; i < 5; ++i) { threads[i] = std::thread(print_vec); } for (std::thread& ref_thread : threads) { ref_thread.join(); } return 0; }
demo2:io
#include <iostream> #include <thread> #include <mutex> #include "Singleton.h" void function(int& number) { number = 20; } int main() { int number{ 0 }; std::once_flag onceFlag; std::call_once(onceFlag, function, number); std::cout << number << std::endl; //20! ref number return 0; }