call_once/once_flag的使用

为了保证在多线程环境下,某个代码段仅仅被调用一次,比如,初始化某个对象,而这个对象只能初始化一次,就可以用std::call_once来保证代码段在多线程环境下只被调用一次。

使用std::call_once时候,需要一个once_flag作为call_once的参数:

#include <iostream>
#include <thread>
#include <vector>
#include <string>
#include <mutex>
#include <map>

using namespace std;

std::once_flag falg;

void do_once(){
    std::cout << "Call Before!" << endl;
    std::call_once(falg,[](){std::cout << "Calling...!" << std::endl;});
    std::cout << "Call After!" << endl;
}

int main(){
    std::thread t1(do_once);
    std::thread t2(do_once);
    std::thread t3(do_once);
    t1.join();
    t2.join();
    t3.join();
    return 0;
}

注意:这里仅仅do_once函数中的一段代码,仅仅被调用一次,代码前后还是会被多次调用!

原文地址:https://www.cnblogs.com/iuyy/p/13917892.html