首页 > C 多线程编程之在类中使用多线程(thread)的方法

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

一、thread的基本用法

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

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

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

#include 
#include 
#include 
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
", 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)
", i, p->_x, p->_y);p->_x = 200;
}//! 友元函数,通过引用来访问类的实例
void reference_style(Position &p, int i) {printf("reference_style:%d(%d,%d)
", 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)
", 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 
#include 
#include 
using namespace std;class M{
private:vector numbers;vector 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;inumbers[i]);}}
};int main(){M m(12);return 0;
}

 

更多相关:

  • 多线程有什么好处?提高CPU的利用率,更好地利用系统资源,使用Monitor类可以同步静态/实例化的方法的全部代码或者部分代码段,使用不同的同步类创建自己的同步机制。多线程指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程提升整体处理性能。多线程是指程序中包含多个执行流,即...

  • Step1:在界面主函数的构造函数中初始化多线程 auto mythread = new QThread(); //新建connect(mythread , &QThread::finished, mythread, &QObject::deleteLater);//线程运行结束后释放内存object1->moveToThread...

  • 本博文是根据中科大信息学院谭立湘老师的课件加上自己的理解整理出来的 ************************************************************************************ NVIDIA在2007年推出CUDA这个统一计算架构 CUDA的基本思想是支持大量的线程级并...

  • 一、parallel communication patterns   并行通信模式 Map:映射,在特定的位置读取和写入。 Gather:收集,从多个不同的位置读入,写入一个位置。 Scatter:分发,写入多个位置。 Transpose转置 结构数组缩写为AOS,数组结构缩写为SOA 转置运算是指任务重新排序内存中的数...

  • 情况一:后台给的日期是Sat Jul 31 2021 21:50:01 GMT+0800 (中国标准时间),如果直接呈现给用户,他们一定会吐槽你不说人话~~~ 情况二:后台给的百分数是小数没有转化成00%格式 采用vue的过滤机制就可以解决这种情况,有两种方式: 第一种:全局写法,在main.js里面加入 // 【...

  • 问题描述 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。 例如:输入test.exe  -a 1 2       执行1+2输出3 问题分析 上面的逻辑思维很简单,但是问题在于如何在VS中向...

  • ------------------------siwuxie095                         MyBatis 中 #{} 和 ${} 的区别       1、在 MyBatis 的映射配置文件中,动态传递参数有两种方式:    (1)#{} 占位符    (2)${} 拼接符          2、#{} 和...

  •     #2.6 map()# 第一个参数传入一个函数,,第二个参数为一个可迭代对象li_1 = (1,3,5,7)def funcA(x): return x*xm1 = map(funcA,li_1)print(type(m1))print(m1())# 2.6 reduce()# 第一个参数传入一个函数,第二个参数 可以迭...

  • 列表,元组,字典的转换。 list列表是一组可变的元素集合 列表是'[]'括号组成的,[]括号包含所有元素,列表的创建可以传递字符串,也可以传递多个字符串来创建列表。如"asd", / "a","b" ... tuple元组的创建和列表一致,区别在于 元组是以'()'创建的,并且元组数据不可变。 dict字典不同于列表和元组,他...

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...