c/c++语言开发共享c/c++ 多线程 std::call_once的应用

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


多线程 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(); } 

执行结果:只打印出一次“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

c/c++ 多线程 std::call_once的应用

本人微信:xiaoshitou5854

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/606439.html

(0)
上一篇 2021年5月13日
下一篇 2021年5月13日

精彩推荐