• c++ -- call_once用法


    API

    template <class Fn, class... Args>
    void call_once (once_flag& flag, Fn&& fn, Args&&... args);
    

    功能

    保证某个函数对象只执行一次
    传入一个flag,内部通过该flag的改变来控制代码只调用一次

    注意

    • 控制只调用一次的前提是同一个flag, 不同flag没办法达到控制的目的
    • 如果已经有线程执行过了,则新来的线程不会再执行
    • 如果有线程正在执行,则新来的线程会阻塞等待
    • 如果正在执行的线程抛出异常,则不算执行完成,其他线程会重新执行

    试验

    std::once_flag flag;
    
    void Test() {
        std::call_once(flag, []() {
            cout << "start" << endl;
            this_thread::sleep_for(chrono::milliseconds(1000));
        });
        cout << "exec end!!!" << endl; //每个线程都会阻塞等待call_once的函数执行完成
    }
    
    int main()
    {
        vector<thread> v(100);
    
        for (uint32_t i = 0; i < 10; i++) {
            v[i] = thread(Test);
        }
    
        for (uint32_t i = 0; i < 10; i++) {
            v[i].join();
        }
    
    }
    

    输出:
    start
    exec end!!!
    exec end!!!
    exec end!!!
    exec end!!!
    exec end!!!
    exec end!!!
    exec end!!!
    exec end!!!
    exec end!!!
    exec end!!!

  • 相关阅读:
    NOIP2016 愤怒的小鸟
    LCIS code force 10D
    UVA 1398
    uva1382 Distant Galaxy
    洛谷-3930(我在洛谷上也写了题解)
    HDU-1505 City Game
    导弹拦截n logn的算法(单调性)洛谷1020
    POJ 1182 食物链
    POJ
    1202. 交换字符串中的元素
  • 原文地址:https://www.cnblogs.com/mooooonlight/p/13816005.html
Copyright © 2020-2023  润新知