zoukankan      html  css  js  c++  java
  • c/c++ 多线程 std::call_once的应用

    多线程 std::call_once的应用

    std::call_once的应用:类成员的延迟初始化,并只初始化一次。和static的作用很像,都要求是线程安全的,c++11之前在多线程的环境下,static好像不是线程安全的,c++11开始,static是线程安全的了。

    注意:即使某一个特定的线程里,多次调用了std::call_once,实际的效果是std::call_once里的函数也只被执行一次。

    例子:模仿建立数据库的连接,只有在放生send_data或者receive_data的时候,才去连接数据库,并且只连接了一次。即使,既调用了send_data也调用了receive_data,但是open_connection只被执行了一次,也就是说数据库的连接只建立一次就够了,不管你是要接收,还是要发送。

    #include <mutex>
    #include <thread>
    #include <iostream>
    
    class X{
      int connect_detail;
      std::once_flag connect_init_flag;
      void open_connection(){
        std::cout << "open:" << connect_detail << std::endl;
        //open();
      }
    
    public:
      X(int detail):connect_detail(detail){}
      void send_data(){
        std::call_once(connect_init_flag, &X::open_connection, this);
        //send();
      }
      void receive_data(){
        std::call_once(connect_init_flag, &X::open_connection, this);
        //receive();
      }
    };
    
    int main(){
      X x(10);
      x.send_data();
      x.receive_data();
    }
    
    

    github源代码

    执行结果:只打印出一次“open:10”。

    结果分析:虽然即调用了send_data,也调用了receive_data,但是open_connection只被执行了一次。

    小知识点:下面的&X::open_connection的用法,必须有&和this,虽然open_connection的参数列表为空。因为open_connection是类的成员方法,所以就必须绑定到这个类的某个具体对象上,所以才必须有this和&。&是为了告诉编译器,这个方法不是类的static方法,而是类的成员方法。

    std::call_once(connect_init_flag, &X::open_connection, this);
    

    c/c++ 学习互助QQ群:877684253

    本人微信:xiaoshitou5854

  • 相关阅读:
    Android开发之Intent.Action
    package.json中版本号前的符号含义
    npm ERR! code 128
    前端vue项目添加单元测试及sonar配置
    npm ERR! code: 'EPERM' npm安装依赖时报错
    vue单文件中,解决相同ref出现多个的问题
    'NODE_ENV' 不是内部或外部命令,也不是可运行的程序 或批处理文件
    程序调试问题呈现
    Qt三维点云散点数据显示QtDataVisualization
    win环境下获取利用qt获取u盘信息
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/9919347.html
Copyright © 2011-2022 走看看