#include <iostream>
#include <string>
#include <thread>
#include <vector>
#include <list>
#include <mutex>
#include <future>
using namespace std;
int mythread() //线程入口函数
{
cout << "mythread start" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
std::chrono::milliseconds dura(5000); //休息5秒
std::this_thread::sleep_for(dura);
cout << "mythread end" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
return 100;
}
int main()
{
cout << "MianThreadID = " << std::this_thread::get_id() << endl; //打印主线程id
std::future<int> ret = std::async(mythread); //创建线程并开始执行
//将future对象与async创建的线程绑定到一起,流程不卡在这里,继续运行
std::cout << ret.get() << std::endl; //卡在这里等待mythread执行完毕,拿到结果
//主线程执行
std::cout << "主线程结束" << std::endl;
return 0;
}
【使用类成员函数作为线程入口函数】
#include <iostream>
#include <string>
#include <thread>
#include <vector>
#include <list>
#include <mutex>
#include <future>
using namespace std;
class A{
public:
int a_thread(int var) //线程入口函数
{
cout << var << endl;
cout << "mythread start" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
std::chrono::milliseconds dura(5000); //休息5秒
std::this_thread::sleep_for(dura);
cout << "mythread end" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
return 100;
}
};
int main()
{
A a;
int tmp{666};
cout << "MianThreadID = " << std::this_thread::get_id() << endl; //打印主线程id
std::future<int> ret = std::async(&A::a_thread, &a, tmp); //第二个参数是一个对象引用,才能保证线程里使用的是同一个对象
std::cout << ret.get() << std::endl; //卡在这里等待mythread执行完毕,拿到结果
//主线程执行
std::cout << "主线程结束" << std::endl;
return 0;
}
【std::launch::deferred】
【std::launch::async】
#include <iostream>
#include <string>
#include <thread>
#include <vector>
#include <list>
#include <mutex>
#include <future>
using namespace std;
int mythread(int var) //线程入口函数
{
cout << var << endl;
cout << "mythread start" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
std::chrono::milliseconds dura(5000); //休息5秒
std::this_thread::sleep_for(dura);
cout << "mythread end" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
return 100;
}
int main()
{
cout << "MianThreadID = " << std::this_thread::get_id() << endl; //打印主线程id
std::packaged_task<int(int)> myTask(mythread); //将函数mythread包装起来
int tmp{ 233 };
std::thread objThread(std::ref(myTask), tmp); //线程直接开始执行,第二个参数作为线程入口函数的参数
objThread.join(); //等待线程执行完毕
std::future<int> ret = myTask.get_future(); //future包含有线程入口函数的返回结果,这里保存mythread的返回结果
cout << ret.get() << endl;
//主线程执行
std::cout << "主线程结束" << std::endl;
return 0;
}
【使用lambda表达式】
#include <iostream>
#include <string>
#include <thread>
#include <vector>
#include <list>
#include <mutex>
#include <future>
using namespace std;
int main()
{
cout << "MianThreadID = " << std::this_thread::get_id() << endl; //打印主线程id
std::packaged_task<int(int)> myTask([](int var) {
cout << var << endl;
cout << "mythread start" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
std::chrono::milliseconds dura(5000); //休息5秒
std::this_thread::sleep_for(dura);
cout << "mythread end" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
return 100;
}); //将lambda表达式包装起来
int tmp{ 233 };
std::thread objThread(std::ref(myTask), tmp); //线程直接开始执行,第二个参数作为线程入口函数的参数
objThread.join(); //等待线程执行完毕
std::future<int> ret = myTask.get_future(); //future包含有线程入口函数的返回结果,这里保存lambda表达式的返回结果
cout << ret.get() << endl;
//主线程执行
std::cout << "主线程结束" << std::endl;
return 0;
}
【packaged_task作为可调用对象直接调用】
#include <iostream>
#include <string>
#include <thread>
#include <vector>
#include <list>
#include <mutex>
#include <future>
using namespace std;
int main()
{
cout << "MianThreadID = " << std::this_thread::get_id() << endl; //打印主线程id
std::packaged_task<int(int)> myTask([](int var) {
cout << var << endl;
cout << "mythread start" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
std::chrono::milliseconds dura(5000); //休息5秒
std::this_thread::sleep_for(dura);
cout << "mythread end" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
return 100;
}); //将lambda表达式包装起来
int tmp{ 233 };
myTask(tmp); //直接调用,相当于直接调用
std::future<int> ret = myTask.get_future(); //future包含有线程入口函数的返回结果,这里保存返回结果
cout << ret.get() << endl;
//主线程执行
std::cout << "主线程结束" << std::endl;
return 0;
}
【结合容器和移动语义使用】
#include <iostream>
#include <string>
#include <thread>
#include <vector>
#include <list>
#include <mutex>
#include <future>
using namespace std;
std::vector<std::packaged_task< int(int)>> TaskVector;
int main()
{
cout << "MianThreadID = " << std::this_thread::get_id() << endl; //打印主线程id
std::packaged_task<int(int)> myTask([](int var) {
cout << var << endl;
cout << "mythread start" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
std::chrono::milliseconds dura(5000); //休息5秒
std::this_thread::sleep_for(dura);
cout << "mythread end" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
return 100;
}); //将lambda表达式包装起来
TaskVector.push_back(std::move(myTask)); //加入至容器,使用了移动语义,进去后myTask就为空
//...
//取出来调用
std::packaged_task< int(int)> myTask2;
auto iter = TaskVector.begin();
myTask2 = std::move(*iter);
TaskVector.erase(iter); //删除第一个元素,之后迭代器就失效了,后面不可以使用iter了
myTask2(72); //直接调用,相当于直接调用
std::future<int> ret = myTask2.get_future(); //future包含有线程入口函数的返回结果,这里保存返回结果
cout << ret.get() << endl;
//主线程执行
std::cout << "主线程结束" << std::endl;
return 0;
}
#include <iostream>
#include <string>
#include <thread>
#include <vector>
#include <list>
#include <mutex>
#include <future>
using namespace std;
void mythread(std::promise<int>& tmp, int clc)
{
cout << "mythread start" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
//做一系列复杂运算
clc++;
clc *= 233;
//其他运算,比如花费了5秒钟
std::chrono::milliseconds dura(5000); //休息5秒
std::this_thread::sleep_for(dura);
//计算出结果
int ret = clc; //保存结果
tmp.set_value(ret); //结果保存到tmp中
cout << "mythread end" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
}
int main()
{
cout << "MianThreadID = " << std::this_thread::get_id() << endl; //打印主线程id
std::promise<int> var_pro; //创建一个promise对象,用来保存int类型的值
std::thread objThread(mythread, std::ref(var_pro), 10);
//获取结果
objThread.join();
std::future<int> t1 = var_pro.get_future(); //promise和线程绑定,用于获取线程返回值
auto val1 = t1.get();
cout << val1 << endl;
//主线程执行
std::cout << "主线程结束" << std::endl;
return 0;
}
【线程1中返回值,线程2调用(promise + future 起连接作用),实现两个线程之间数据传递】
#include <iostream>
#include <string>
#include <thread>
#include <vector>
#include <list>
#include <mutex>
#include <future>
using namespace std;
void mythread(std::promise<int>& tmp, int clc)
{
cout << "mythread start" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
//做一系列复杂运算
clc++;
clc *= 233;
//其他运算,比如花费了5秒钟
std::chrono::milliseconds dura(5000); //休息5秒
std::this_thread::sleep_for(dura);
//计算出结果
int ret = clc; //保存结果
tmp.set_value(ret); //结果保存到tmp中
cout << "mythread end" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
return;
}
void mythread2(std::future<int>& tmp)
{
cout << "mythread2 start" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
auto val = tmp.get();
cout <<"mythread2 val = " << val << endl;
cout << "mythread2 end" << "ThreadId = " << std::this_thread::get_id() << endl; //打印线程id
return;
}
int main()
{
cout << "MianThreadID = " << std::this_thread::get_id() << endl; //打印主线程id
std::promise<int> var_pro; //创建一个promise对象,用来保存int类型的值
std::thread objThread(mythread, std::ref(var_pro), 10);
//获取结果
objThread.join();
std::future<int> t1 = var_pro.get_future(); //promise和线程绑定,用于获取线程返回值
std::thread objThread2(mythread2, std::ref(t1));
//获取结果
objThread2.join(); //等线程2执行完毕
//主线程执行
std::cout << "主线程结束" << std::endl;
return 0;
}
【小结】