在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;

即将该函数定义成已删除的函数,任何试图调用它的行为将产生编译期错误。是C++11标准的内容。
lk.push_back(std::move(__p)); ,若果不用move的话会报错

因为future的拷贝构造函数已经被定义为删除delete函数。所以需要用move转移控制权。

https://blog.csdn.net/tmxfh/article/details/54799693

C++ 11 线程调用类的成员函数解决办法的更多相关文章

  1. 空类指针为什么可以调用类的成员函数 以及 A(){}和A();

    1. 代码及问题 #include <iostream> using namespace std; class A { public: A() {} //A *p = new A()时:此 ...

  2. 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 ...

  3. Spring事务调用类自己方法失效解决办法和原因

    问题 正常情况下,我们都是在controller里调用service里的方法,这个方法如果需要加事务,就在方法上加上@Transactional,这样是没问题的,事务会生效. 可是如果像下面这样,绕以 ...

  4. C++编译器是如何管理类和对象的,类的成员函数和成员变量

    C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类.从计算机的角度,程序依然由数据段(栈区内存)和代码段(代码区内存)构成. #include ...

  5. 在类的成员函数中调用delete this

    最近面试的时候被问到一个问题是,在C++中,能否在类的成员函数中调用delete this,后来网上查了一下资料,关于这个问题说得比较好的有http://blog.sina.com.cn/s/blog ...

  6. C++ 类的成员函数指针 ( function/bind )

    这个概念主要用在C++中去实现"委托"的特性. 但现在C++11 中有了 更好用的function/bind 功能.但对于类的成员函数指针的概念我们还是应该掌握的. 类函数指针 就 ...

  7. C++学习之路—运算符重载(二)运算符重载作为类的成员函数和友元函数

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 对运算符重载的函数有两种处理方式:(1)把运算符 ...

  8. linux 之 pthread_create 实现类的成员函数做参数

    在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static ! 在C语言中,我们使用pthread_create ...

  9. (转)c++类的成员函数存储方式(是否属于类的对象)---一道面试题引发的思考

    昨天去面试一家公司,面试题中有一个题,自己没弄清楚,先记录如下: class D { public: void printA() { cout<<"printA"< ...

随机推荐

  1. 【Vue-01】基础Vue语法+JS复习

    Vue学习疑问及总结_SZS 0.vue router 带参数跳转 发送:this.$router.push({path:'/news',query:{id:row.id}}) 接收:var id=t ...

  2. Jquery的入门(一)

    Jquery介绍 Jquery是一个快速,简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或者是JavaScirpt框架),Jquery设计的宗旨是: ...

  3. Oracle中修改某个字段可以为空

    待修改字段假定为:shuifen 1.当该字段为空时,可直接修改: alter table reportqymx modify shuifen null; 2.当待修改字段不为空时:新增一列把要改变的 ...

  4. 利用fgetc统计文件所在字节 和 总行数 和单词数

    #include <stdio.h> #include <stdlib.h> #define IS_WHITE_SPACE(c) ((c)==' '||(c)=='\t'||( ...

  5. (1)前端框架uni-app

    前端框架uni-app 可编译到iOS.Android.H5.小程序等多个平台 一套代码编到7个平台 uni-app在跨端数量.扩展能力.性能体验.周边生态.学习成本.开发成本等6大关键指标上拥有极强 ...

  6. 2019暑期金华集训 Day7 动态规划

    自闭集训 Day7 动态规划 LOJ6395 首先发现这个树的形态没啥用,只需要保证度数之和是\(2n-2\)且度数大于0即可. 然后设\(dp_{i,j}\)表示前\(i\)个点用了\(j\)个度数 ...

  7. 《挑战30天C++入门极限》入门教程:实例详解C++友元

        入门教程:实例详解C++友元 在说明什么是友元之前,我们先说明一下为什么需要友元与友元的缺点: 通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为pu ...

  8. Resolving EACCES permissions errors when installing packages globally(npm 遇到 write access的问题)

    If you see an EACCES error when you try to install a package globally, you can either: Reinstall npm ...

  9. ZwQuerySystemInfoMation函数使用

    ZwQueryInfoMation函数很简单.就是4个参数. NTSTATUS WINAPI ZwQuerySystemInformation( _In_ SYSTEM_INFORMATION_CLA ...

  10. 查看windows操作系统的默认编码【转】

    在Windows平台下,进入DOS窗口,输入:chcp可以得到操作系统的代码页信息,你可以从控制面板的语言选项中查看代码页对应的详细的字符集信息. 例如: 我的活动代码页为:936,它对于的编码格式为 ...