前言
C++11后在线程这块已经有了thread的类了,如果简单的std::thread可以直接就实现线程的操作,就要我们在开发过程中,很简单的线程可以直接用std::thread就可以了,今天我的小例子用的是std::async,他里面thread的都能实现,而且还能实现一些更多的方法
std::async简单用法
微卡智享
其实这个用法网上可以找到一大堆,这里我就简单说一下就行了,因为这也不是这篇文章想讲的重点。
std::future<T> res = std::async(启动策略, 函数名, 参数);
上面这段就是一个简单的使用,其中async中的三个参数:
当前参数为自己定义的函数指针,函数对象,或是lambda表达式
传当参数2中的参数,多个参数用逗号进行分开即可
int count=res.get();
上面的线程中,我们定义了std::future<T> res,通过res.get()可以直接获取计算后的数值。
线程的使用,可以自己搜索,已经很多相关的介绍文章了,接下来说一下普通参数和指针参数的区别。
代码演示
微卡智享
我们直接贴出来完整代码
#include <thread>
#include<future>
#include<iostream>
#include<Windows.h>
#include<mutex>
using namespace std;
//定义线程锁,防止cout缓冲区输出重叠了
mutex mut;
int AddintPtr(int *x, int *y,int *count) {
for (int i = 0; i < *count; i++) {
*x += *y;
mut.lock();
cout << "指针:" << *x << endl;
mut.unlock();
Sleep(1000);
}
return *x;
}
int Addint(int x, int y, int count) {
for (int i = 0; i < count; i++) {
x += y;
mut.lock();
cout << "整数:" << x << endl;
mut.unlock();
Sleep(1000);
}
return x;
}
int main(int argc, char* argv) {
//定义值
int x, y, z;
x = 1;
y = 1;
z = 10;
future<int> res = async(launch::async, AddintPtr, &x, &y, &z);
future<int> res2 = async(launch::async, Addint, x, y, z);
Sleep(2000);
cout << "=====我是华丽的分割线=====" << endl;
//修改值
y = 5;
z = 15;
cout << "指针结果:" << res.get() << endl;
cout << "整数结果:" << res2.get() << endl;
cout << "=====我是华丽的分割线=====" << endl;
return 0;
}
实现效果
上面的动图就是程序运行后出现的结果 ,接下来我们一步步分析哪里不同。
01
参数执行中改变
上面的图可以看出来,2秒后我们把原来输入的参数值修改后,指针参数的执行的函数中也随着改变而改变了,而普通参数则无变化。
02
使用get()即会等待线程结束
由上面两图可以看出来,get()的方法其实就是像thread.join()一样,就是一直等待线程结束,通过修改了参数后,我们的res2的线程应该比res结果的早,但是最终输出结果也是等到了res.get()完成后才输出的。
小贴士
代码中用到了mutex的线程锁
这里就是想告诉大家,在cout输出的时候,它是直接从缓冲区输出的,刚开始没有加锁的时候,两个线程同时执行时,cout输出时有时候会出现输出在同一行中,所以我们这里加入的metux进行锁的控制,防止出现缓冲区输出重叠的现像出现。