在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

最新文章

  1. CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)
  2. ABP导航源码分析
  3. 图书馆管理系统—NABCD模型竞争性需求分析
  4. swing 复选框
  5. F5 负载均衡
  6. hadoop 异常处理实例(一)hadoop内存配置项
  7. AsMVC:一个简单的MVC框架的Java实现
  8. 使用jsp生成验证码
  9. php pdo and pdostatement
  10. asp.net core 教程(七)-异常处理、静态文件
  11. 【php】DIRECTORY_SEPARATOR的作用
  12. Angular路由——路由守卫
  13. python--第十九天总结(Django)
  14. java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
  15. py3+urllib+re,轻轻松松爬取双色球最近100期中奖号码
  16. Oracle行列转换小结
  17. jQuery CSS()方法改变CSS样式实例解析
  18. 【WPF】代码触发Button点击事件
  19. Babel 入门教程
  20. PHP 简单实现webSocket

热门文章

  1. 创建型模式(四) 建造者\生成器模式(Builder)
  2. Faster-RCNN用于场景文字检测训练测试过程记录(转)
  3. Python凯撒密码和括号匹配
  4. lambda 函数的用法
  5. bzoj 4128: Matrix ——BSGS&amp;&amp;矩阵快速幂&amp;&amp;哈希
  6. gosched
  7. js判断radio选中状态
  8. YAML_11 when条件判断
  9. C语言中一个字符对应一个ascii码;占一个1个字节8个二进制位;存到内存中也是用ascii的十进制的二进制表示
  10. Mybatis 通用Mapper增强