1. 程式人生 > 實用技巧 >c++ -- call_once用法

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!!!