有時候咱們須要的變量(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; }