c++ -- call_once用法
阿新 • • 發佈:2020-10-14
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!!!