前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学习|C++线程与指针结合的小例子

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

作者头像
Vaccae
发布2020-03-26 17:04:30
1K0
发布2020-03-26 17:04:30
举报
文章被收录于专栏:微卡智享

前言

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

std::async简单用法

微卡智享

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

代码语言:javascript
复制
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中的参数,多个参数用逗号进行分开即可

代码语言:javascript
复制
int count=res.get();

上面的线程中,我们定义了std::future<T> res,通过res.get()可以直接获取计算后的数值。

线程的使用,可以自己搜索,已经很多相关的介绍文章了,接下来说一下普通参数和指针参数的区别。

代码演示

微卡智享

我们直接贴出来完整代码

代码语言:javascript
复制
#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进行锁的控制,防止出现缓冲区输出重叠的现像出现。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参数1:启动策略
  • 参数2:函数指针
  • 参数3:函数参数列表
  • 重点来了
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档