当前位置: 首页 > news >正文

C++(线程)

一、线程

1、线程构造函数

类模板原型:template <class Fn, class... Args>explicit thread (Fn&& fn, Args&&... args);

1)thread(线程的构造函数)

格式:#include <thread>thread 线程名(回调函数名 fn , 传递给回调函数的参数 args (数量不定,可以不写));
功能:以线程名,创建一个线程
参数 fn  :线程主函数(或者叫线程入口函数),用户传哪个函数的函数名,线程就执行哪个函数
参数 args:可变参数,允许传入多个不同的参数,给到线程函数 fn,一般来说,这里args传递几个参数,fn就需要写几个对应的形参注意:如果运行报错已放弃,就说明main结束了,没有回收线程资源

2)thread类模板内的成员方法

thread t;
t.join();// 等待,并回收线程t的资源,但是join函数不接受线程主函数的返回值
t.detach();//将线程t设置成分离式线程,进程结束运行的时候,会自动的回收分离式线程的资源
t.joinable(); // 判断线程 t 是分离式的还是结合式的

2、线程回调类中的函数

        Stu::func(类中的静态函数地址)&Stu::func(类中的成员函数的地址)

        线程是不能直接通过对象回调成员方法的,那么就需要其他的方法

Stu zs;
thread t(zs.func);
注意:想要通过对象名回调成员方法这种方法是不行的,是会报错的

1)static(设置静态成员方法)

将类中的成员方法设置为静态成员后,就直接归属于类了,就可以直接通过类名调用了

 2)lambda(使用匿名函数调用)

3)bind(绑定对象和参数)

4)function 和 bind 结合使用

想要用线程回调类中的成员方法,必须确定,回调的是哪个对象的成员属性。

3、关于function类(函数包装器)

  • function 是一个通用的多态函数封装器;
  • function 是一个类模板,可以存储、调用和复制任何可调用对象,比如函数、lambda 表达式或函数对象;
  • function 可以理解为一个封装后的函数指针,功能更加强大;

1)function 的使用

#include <functional>;
function<返回值类型(形参列表)> 对象名 = 函数指针;类模板不定参: <返回值类型(形参列表)>: 是创建对象的类型,应该用函数指针所指向的函数的数据类型
返回值类型: 必须写函数指针指向的函数的返回值类型
形参列表:   不一定要按照函数指针指向的函数的形参列表填,应当填入通过function类的对象传入的参数类型
对象名:     绑定后可以通过对象名调用 函数指针注意:形参列表的位置,是需要传什么参数填什么参数的类型,如果需要传对象的地址,就要填入 类名*const

2)function包装普通函数指针

        将函数指针包装到对象中,通过对象传参调用函数

3)function包装类成员方法指针

1)bind 的使用

格式:template <class Ret, class Fn, class... Args>bind (Fn&& fn, Args&&... args);
功能:为指定函数绑定参数
参数 fn  :函数指针,要绑定的函数
参数 Args:要绑定的参数如果想先不绑定,后面调用在传入,可以使用placeholaers这个类中的占位符 _n 来占位(n表示占第n个占位符)
使用方法:1.bind(函数指针,要传入的参数(不定参));           //绑定普通的函数指针2.bind(函数指针,对象的地址,要传入的参数(不定参)); //绑定类中的成员方法3.bind(函数指针,参数1,参数2,placeholaers::_1);  //占位符占位,后续再传参

2)使用bind绑定后包装普通函数指针

3)使用bind绑定后包装类成员方法指针

(1)bind绑定对象和参数

(2)bind绑定对象,不绑定参数

(3)bind绑定参数,不绑定对象

http://www.dtcms.com/a/315590.html

相关文章:

  • 小米最新ASR音频大模型MiDashengLM
  • WPF 与 Winform :Windows 桌面开发该用谁?
  • linux查看kafka的消费组里是否有积压
  • 电路基础相关知识
  • 【宇树科技+智元机器人】人形机器人产业链核心标的
  • 云手机具有哪些用途?
  • 机器人权利:真实还是虚幻,机器人权利研究如何可能,道德权利与法律权利
  • 腾讯云CodeBuddy AI IDE+CloudBase AI ToolKit打造理财小助手网页
  • arp欺骗
  • GitHub Models:为开源AI项目解决推理难题,让AI更易用、更普及
  • 探索设计模式的宝库:Java-Design-Patterns
  • [验证回文串]
  • 家常菜点餐|基于java和小程序的家庭大厨家常菜点餐系统设计与实现(源码+数据库+文档)
  • 八股——WebSocket
  • 人工智能-python-Sklearn 数据加载与处理实战
  • 从零用java实现小红书springboot_vue_uniapp(15)评论和im添加图片
  • 【升级打怪实录】uniapp - android 静态声明权限和动态请求权限的区别
  • 【Linux】特效爆满的Vim的配置方法 and make/Makefile原理
  • uniapp基础(五)调试与错误
  • uniapp转app时,cover-view的坑
  • uniapp云打包打包安卓app失败,显示:本地安装包生成失败,请重试或者切换到非安心打包模式进行打包
  • uniapp Android App集成支付宝的扫码组件mPaaS
  • ubuntu-server安装
  • RabbitMQ面试精讲 Day 11:RabbitMQ集群架构与节点类型
  • 解决错误nvcc fatal : Unsupported gpu architecture ‘compute_86‘
  • 概率论角度: Laplace 算子和分数阶 Laplace 算子
  • BLE 安全连接:LE Secure Connections 与椭圆曲线密钥交换面试高频考点与真题解析
  • C++信息学奥赛一本通-第一部分-基础一-第2章-第1节
  • AlmaLinux8 平替 manylinux_2_28-python 的 GPG密钥管理、安装 cuda sdk
  • 使用ProxySql实现MySQL的读写分离