学习|C++线程与指针结合的小例子

学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为1829,预计阅读5分钟

前言

C++11后在线程这块已经有了thread的类了,如果简单的std::thread可以直接就实现线程的操作,就要我们在开发过程中,很简单的线程可以直接用std::thread就可以了,今天我的小例子用的是std::async,他里面thread的都能实现,而且还能实现一些更多的方法

std::async简单用法

微卡智享

其实这个用法网上可以找到一大堆,这里我就简单说一下就行了,因为这也不是这篇文章想讲的重点。

std::future<T> res = std::async(启动策略, 函数名, 参数);

上面这段就是一个简单的使用,其中async中的三个参数:

参数1:启动策略

  • std::launch::async 保证异步行为,执行后,系统创建一个线程执行对应的函数

  • std::launch::deffered 当其他线程调用get()来访问共享状态时,将调用非异步行为

  • std::launch::async||std::launch::deffered 默认策略,由系统决定怎么调用

参数2:函数指针

当前参数为自己定义的函数指针,函数对象,或是lambda表达式

参数3:函数参数列表

传当参数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进行锁的控制,防止出现缓冲区输出重叠的现像出现。

扫描二维码

获取更多精彩

微卡智享

「 往期文章 」

学习|Android中Presentation分屏的简单使用

Android通讯库VNanoMsg的1.0.1发布

学习|Android制作开源库

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值