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;
}

 

posted @ 2022-08-29 13:47  zwj鹿港小镇  阅读(715)  评论(0)    收藏  举报