C++ 11 线程调用类的成员函数解决办法
在C++中,_beginthreadex 创建线程是很麻烦的。要求入口函数必须是类的静态函数。
通常,可以采用thunk,或者模板来实现。
因C++ 11中引入了 std::async ,可以很好的解决这个问题了。
值得注意的是,在循环中 std::async 创建线程,我试了好多次总是失败,后来看老外的代码,采用 std::move解决了问题。
具体见实现代码。
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <functional>
#include <process.h>
#include <thread>
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <iterator>
#include <future>
#include <list>
#include <sstream>
using namespace std; typedef UINT(WINAPI* THREADPROC)(LPVOID); class XTest
{
public:
XTest() {};
~XTest() {}; UINT XTest::RunLoop(LPVOID obj)
{
int count = ;
for (int i = ; i < ; i++)
{
Sleep();
std::ostringstream ostr;
ostr << "线程" << (INT)obj << " 静态执行次数 [" << count++ << "] -RunLoop- " << std::endl;
cout << ostr.str().c_str() << std::endl;
}
return ;
} UINT XTest::XFH()
{
// 问题就出在这里,_beginthreadex不能调用类的成员函数,须静态的才行。
//int rt = _beginthreadex(NULL, 0, (THREADPROC) [this](LPVOID) { return this->RunLoop(0); }, 0, 0, NULL);
// auto pppp = (&XTest::RunLoop);
// ULONG_PTR* kkkk = (ULONG_PTR*)&pppp;
std::list<std::future<UINT> > lk;
for (int i = ; i< ; i++)
{
//auto __p = std::async(std::launch::async , [this, i]() {return this->RunLoop((LPVOID)i); });
auto __p = std::async(std::launch::async, &XTest::RunLoop, this, (LPVOID)i);
// __p.wait(); 不可以调用。否则会变成同步了。
lk.push_back(std::move(__p)); // 这里必须要用move,否则就会变成同步了。。测试是会报错。
//auto k = std::thread([this , i]() {this->RunLoop((LPVOID)i); });
//k.detach();
}
// 此行代码用于等线程结束,会阻塞主线程。
for (auto &e : lk)
{
e.wait();
}
cout << "等线程结束" << endl;
Sleep();
return ;
}
}; int main()
{
auto mmm = new XTest;
mmm->XFH();
cout << "------";
getchar();
return ;
}
C++在函数定义的时候在后面加上=delete是什么意思例如:RoundRobin(const RoundRobin& rhs) = delete;
lk.push_back(std::move(__p)); ,若果不用move的话会报错

因为future的拷贝构造函数已经被定义为删除delete函数。所以需要用move转移控制权。
https://blog.csdn.net/tmxfh/article/details/54799693
C++ 11 线程调用类的成员函数解决办法的更多相关文章
- 空类指针为什么可以调用类的成员函数 以及 A(){}和A();
1. 代码及问题 #include <iostream> using namespace std; class A { public: A() {} //A *p = new A()时:此 ...
- VC6.0中友元函数无法访问类私有成员的解决办法
举个例子: 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 27 28 29 30 31 32 33 #inclu ...
- Spring事务调用类自己方法失效解决办法和原因
问题 正常情况下,我们都是在controller里调用service里的方法,这个方法如果需要加事务,就在方法上加上@Transactional,这样是没问题的,事务会生效. 可是如果像下面这样,绕以 ...
- C++编译器是如何管理类和对象的,类的成员函数和成员变量
C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类.从计算机的角度,程序依然由数据段(栈区内存)和代码段(代码区内存)构成. #include ...
- 在类的成员函数中调用delete this
最近面试的时候被问到一个问题是,在C++中,能否在类的成员函数中调用delete this,后来网上查了一下资料,关于这个问题说得比较好的有http://blog.sina.com.cn/s/blog ...
- C++ 类的成员函数指针 ( function/bind )
这个概念主要用在C++中去实现"委托"的特性. 但现在C++11 中有了 更好用的function/bind 功能.但对于类的成员函数指针的概念我们还是应该掌握的. 类函数指针 就 ...
- C++学习之路—运算符重载(二)运算符重载作为类的成员函数和友元函数
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 对运算符重载的函数有两种处理方式:(1)把运算符 ...
- linux 之 pthread_create 实现类的成员函数做参数
在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static ! 在C语言中,我们使用pthread_create ...
- (转)c++类的成员函数存储方式(是否属于类的对象)---一道面试题引发的思考
昨天去面试一家公司,面试题中有一个题,自己没弄清楚,先记录如下: class D { public: void printA() { cout<<"printA"< ...
随机推荐
- Makefile学习二
今天继续对Makefile进行研究,话不多说,进入正题: make常用内嵌函数: 下面利用上面的知识点来实现一个多级目录的Makefile,如下: 多级目录Makefile: 这个例子的目录结构如下: ...
- synchronized(修饰方法和代码块)
synchronized(修饰方法和代码块) 1. 含义 synchronized 是同步锁,用来实现互斥同步. 在 Java 中,关键字 synchronized 可以保证在同一个时刻,只有一个线程 ...
- 《基于 Java EE 的高校重修管理系统设计与实现》论文笔记(九)
标题:基于 Java EE 的高校重修管理系统设计与实现 一.基本信息 时间:2015 来源:河海大学文天学院 关键词::Java EE 架构: B/S 模式: 重修管理系统 二.研究内容 1.需求分 ...
- 自定义创建vue文件代码块
"vue-component": { "prefix": "vue-component", "body": [ &quo ...
- HTTP和HTTPS的区别和常见的面试题
本篇会着重介绍http和https的区别和常见的面试题 常见的http和https面试题: Http与Https的基本概念和他们的区别 HTTPS工作原理 常用的HTTP方法有哪些 GET方法与POS ...
- 区别和认识.net四个判等方法
概要 本方介绍.net如何判断两个对象是否相等 .Net有四个判等函数 1)Object.ReferenceEquals 2)Object.Equals 3)对象实例的Equals 4)==操作符 这 ...
- 洛谷 P1439 【模板】最长公共子序列 题解
每日一题 day40 打卡 Analysis 因为两个序列都是1~n 的全排列,那么两个序列元素互异且相同,也就是说只是位置不同罢了,那么我们通过一个book数组将A序列的数字在B序列中的位置表示出来 ...
- Day11:Flex布局
参考: 来源:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html 网页布局是css的一个重点. 盒子模型 display属性 positi ...
- Linux下多线程模拟停车场停车
#include<stdio.h> #include<string.h> #include<unistd.h> #include<stdlib.h> # ...
- 《挑战30天C++入门极限》类的分解,抽象类与纯虚函数的需要性
类的分解,抽象类与纯虚函数的需要性 为了不模糊概念在这里我们就简单的阐述一下类的分解,前面的教程我们着重讲述了类的继承,继承的特点就是,派生类继承基类的特性,进行//站点:www.cndev- ...