1、C++11中std::call_once的使用
一、使用背景
C++11中的std::call_once函数位于<mutex>头文件中。
在多线程编程中,有时某个任务只需要执行一次,此时可以用C++11中的std::call_once函数配合std::once_flag来实现。如果多个线程需要同时调用某个函数,std::call_once可以保证多个线程对该函数只调用一次。也可用在解决线程安全的单例模式。
- 若调用call_once一切顺利,将会翻转once_flag变量的内部状态,再次调用该函数时,所对应的目标函数不会被执行。
- 若调用call_once中发生异常,不会翻转once_flag变量的内部状态,再次调用该函数时,目标函数仍然尝试执行。
二、代码范例:
#include <iostream> #include <mutex> #include <vector> std::once_flag g_once_flag; void Test() { std::call_once(g_once_flag, []() { std::cout << "Test Call" << std::endl; }); } int main(void) { std::vector<std::thread> vecThread; for (int i = 0; i < 5; i++) { vecThread.emplace_back(Test); } for (auto& item : vecThread) { if (item.joinable()) item.join(); } return 0; }
111

浙公网安备 33010602011771号