一、thread的基本用法

参见C++使用thread类多线程编程 。

二、类外使用多线程,访问类的成员

这几种方式,新建线程都是在类外,然后通过把友元函数或者成员函数作为thread参数。

#include <iostream>
#include <thread>
#include <vector>
using namespace std;class Position {
public:Position(int xx, int yy) : _x(xx), _y(yy) {};int& x(){ return _x; }int& y(){ return _y; }void member_func(int i) {printf("member_func:%d\n", i);_x = 100;}friend void pointer_style(Position *p, int i);friend void reference_style(Position &p, int i);private:int _x;int _y;
};//! 友元函数,通过指针来传递类的实例
void pointer_style(Position *p, int i) {printf("pointer_style:%d(%d,%d)\n", i, p->_x, p->_y);p->_x = 200;
}//! 友元函数,通过引用来访问类的实例
void reference_style(Position &p, int i) {printf("reference_style:%d(%d,%d)\n", i, p._x, p._y);p._x = 300;
}int main() {Position p(1, 2);/*** 1、使用类的成员函数作为子线程的参数* 参数说明://参数1是成员函数的指针,参数2是Position对象值传递,* 子线程中对p的修改不会影响主线程中的对象p。*/thread t1(&Position::member_func, p, 233);t1.join();cout << "p.x=" << p.x() << endl;/*** 2、使用类的友元函数作为参数* 友元函数参见:https://blog.csdn.net/mary19920410/article/details/70036878* 参数说明:参数1是Position的友元函数reference_style,参数2是用ref包装过的引用,* 参数3是传给reference_style函数的值。* 在这种方式中,由于p是以引用的方式传递给子线程,在子线程中对p的修改相当于修改主线程中的p。*/std::thread t2(reference_style, ref(p), 1);t2.join();cout << "p.x=" << p.x() << endl;/*** 3、使用类的友元函数作为参数* 参数说明:参数1是Position的友元函数pointer_style,参数2是p的指针,参数3是传给* pointer_style的参数。* 在这种方式中,由于p是以引用的方式传递给子线程,在子线程中对p的修改相当于修改主线程中的p。*/std::thread t3(pointer_style, &p, 1);t3.join();cout << "p.x=" << p.x() << endl;/*** 4、通过lambda传递引用参数* 关于lambda函数的说明:https://blog.csdn.net/u010984552/article/details/53634513*/auto lambda_func = [&p](int i) -> void {printf("lambda_func:%d(%d,%d)\n", i, p.x(), p.y());p.x() = 400;};/*** 参数说明:参数1是lambda表达式,参数2是传递给lambda表达式的参数* 由于在lambda_func是以引用的方式捕获p,所以在子线程中p是主线程中p的引用,在子线程中修改p* 相当于主线程修改主县城中的p。也可以以值传递的方式捕获p,这样在子线程中修改p就不会影响到主* 线程中的p。*/thread t4(lambda_func, 123);t4.join();cout << "p.x=" << p.x() << endl;return 0;
}

三、类内使用多线程,访问类的成员

这种方法是把lambda函数(参考链接)作为线程参数,使用lambda函数捕获类的成员函数及属性,然后就可以在类内使用多线程。

#include <iostream>
#include <thread>
#include <vector>
using namespace std;class M{
private:vector<int> numbers;vector<thread> ts;
public:/*** 构造函数* @param thread_count 线程数量*/M(const int thread_count){numbers.resize(thread_count); // 调整数字容量//! 定义lambda函数,捕获类的成员和变量,作为thread的参数,//! 这样,就可以在子线程里访问类的成员。auto lambda_fun = [&](int i) -> void {this->numbers[i] = i;for(int j=0;j<10000;j++);};//! 创建线程for(int i=0;i<thread_count;i++){ts.push_back(thread(lambda_fun,i));}//! 等待子线程结束for(int i=0;i<thread_count;i++){ts[i].join();}//! 打印结果for(int i=0;i<thread_count;i++){printf("numbers[%d]=%d\n", i, this->numbers[i]);}}
};int main(){M m(12);return 0;
}

C 多线程编程之在类中使用多线程(thread)的方法相关推荐

  1. 多线程编程之二——MFC中的多线程开发

    五.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消息机制,通常 ...

  2. python进阶 多线程编程 —— threading和queue库实现多线程编程

    python进阶 多线程编程 -- threading和queue库实现多线程编程) 摘要 多线程实现逻辑封装 模型参数选择实例 摘要 本文主要介绍了利用python的 threading和queue ...

  3. C#判断一个类中有无指定名称的方法

    C#中可以通过反射分析元数据来解决这个问题,示例代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 ...

  4. 错误: 在类中找不到 main 方法, 请将 main 方法定义为:public static void main(String[] args)否则 JavaFX 应用程序类必须扩展javafx.ap

    最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...

  5. python类定义中__init__()_转:python学习——类中为什么要定义__init__()方法

    学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1.不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. 1 classRectangl ...

  6. java实体类没有映射文件_MyBatis自动生成实体类、DAO和XML映射文件,并去掉实体类中的getter和setter方法...

    今天花了3个多小时搞定了这个事情,写个Blog记录一下,先看一下最终生成的实体类吧. packagecom.mybatis.pojo;importlombok.AllArgsConstructor;i ...

  7. java中的actionlistener_JAVA事件监听器之BUTTON类中的ADDACTIONLISTENER(ACTIONLISTENER L)方法...

    JAVA:事件监听器之Button类中的addActionListener(ActionListener l)方法 addActionListener public void addActionLis ...

  8. File类中的list和listFiles方法

    File类中的list和listFiles方法 list()方法是返回某个目录下的所有文件和目录的文件名,返回的是String数组 listFiles()方法是返回某个目录下所有文件和目录的绝对路径, ...

  9. 类中一定要有主方法吗?

    类中一定要有主方法吗? 1:不一定要有main,一个项目中可以有多个main,一个项目可以有好好多个类,每个类里面都可以有1个main方法,web应用中不需要经过这些main方法 2:控制台应用中,必 ...

最新文章

  1. ORBBuf : 一种鲁棒的视觉SLAM缓冲方法
  2. 【周末阅读】10年内,19个关键技术将改变世界
  3. ossec 学习二 (ossec -analogi安装)
  4. UNITY插件信息收集
  5. Python 全栈开发基础
  6. 太阳系八大行星碰撞的视频_火星的身世:从太阳系的起源说起
  7. android设置多个按钮,android代码中设置两个按钮之间位置
  8. 分区界限必须调整为高于最后一个分区界限_不花一分钱,为SSD硬盘腾空间
  9. java rf14bug_hadoop2.7.0集群,使用中遇到的bug及解决办法
  10. 单片机模拟计算机课设,单片机课程设计题目汇总(全)
  11. Pass4side EMC E20-817认证考试题库
  12. String的startWith()和endWith()
  13. 日历获取当前月份的月数与当前月份第一天离第一个格子的位置。
  14. 中缀表达式转后缀表达式规则
  15. 转 计算广告 KPI 公式
  16. Carsim应用:LKA车道保持辅助系统(LQR控制器模型)
  17. webview出现图片加载异常 Mixed Content: The page at 'https
  18. C语言中pow()指数函数的使用问题简述
  19. 基于Matlab答题卡图像检测识别研究
  20. 送书送书送书,(包邮)送,仅此而已!

热门文章

  1. ucgui下制作漂亮按键
  2. 负载均衡中使用 Redis 实现共享 Session
  3. 导入drupal中文语言包
  4. 奇妙的算法之LCS妙解
  5. 3种方式理解旋转变换
  6. 经典dp最长递增子序列
  7. python3 opencv_Python3 OpenCV3 图像处理基础
  8. ESI计算机排名2021年01月,喜忧参半!2021年5月ESI世界大学排行榜,21个学科排名数据分析!...
  9. mysql中关系怎么弄_mysql数据库关系操作
  10. linux+任务默认优先级,uclinux内核的任务优先级及其load_weight