C++线程处理函数的返回值

2023-11-16

引言

关于线程处理函数,常见的可能是返回值为void类型,那线程处理函数是否能定义自己想要的返回值类型呢,这里请看下面的说明。

C++线程返回值


应用环境

通常主线程某些任务需要通过子线程完成数据处理之后才能继续执行;传统的方式就是主线程标志位给到子线程去,然后主线程这边采用循环等待的方式去等标志是否已经完成标示。另外一种方式就是使用c++11 promis 和future来完成


1、传统的方式获取线程返回值

代码如下:

#include <QCoreApplication>
#include <thread>
#include <QDebug>
#include <QString>

using namespace std;
void thread_old(bool *pRet)
{
    qDebug() << QString("thread_old is called.");
    *pRet = true;
}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // use the old way
    bool bReturn = false;
    thread threadOld(thread_old, &bReturn);
    threadOld.detach();
    while (true)
    {
        if (bReturn)
        {
            qDebug() << QString("thread_old is return");
            break;
        }
    }

    return a.exec();
}

输出结果如下:
在这里插入图片描述

2、使用C++ Promise和future方式

代码如下:

#include <iostream>       
#include <thread>         
#include <future>    
#include <QDebug>
using namespace std;
void thread_new(promise<bool> *bPromise)
{
qDebug() << QString(“thread_new is called.) << “\n”;
bPromise->set_value(true);
}

void main()
{
// the new way
promise<bool> bPromise;
future<bool> bFuture = bPromise.get_future();
thread threadNew(thread_new, &bPromise);
threadNew.detach();
qDebug() << QString(“future val:%1).arg(bFuture.get()) << “\n”;
}

输出结果如下:
在这里插入图片描述


3、promise和future介绍

  • std::future是一个类模板(class template),其对象存储未来的值,一个std::future对象在内部存储一个将来会被赋值的值,并提供了一个访问该值的机制,通过get()成员函数实现。在此之前试图在get()函数可用之前通过它来访问相关的值,那么get()函数将会阻塞,直到该值可用。
  • std::promise也是一个类模板,其对象有可能在将来会被人为赋值,每个std::promise对象有一个对应的std::future对象,一旦由std::promise对象设置,std::future将会对其赋值。
  • std::promise对象与其管理的std::future对象共享数据。

总结

上述方法一中,使用传递变量地址的方式,从而达到修改变量的值。
结合这篇文章,可以看出通过参数可以将想要的值获取,至于能否通过指定返回值类型返回想要的数据这里还是不太清楚,应该是不可以。还是采用参数传回想要的数据吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++线程处理函数的返回值 的相关文章

  • 为什么通过派生类对基类的引用与 :: - 运算符不明确?

    所以我想知道为什么以下钻石问题的代码片段无法编译 我知道这个问题通常是通过虚拟继承来解决的 我不是故意使用它的 该代码只是为了展示我的问题 即为什么编译器称此不明确 因此 我在 struct Base 中声明了两个成员变量 因为这两个子类
  • Volatile.Read 和 Volatile.Write 背后的逻辑是什么?

    来自 MSDN Volatile Read 读取字段的值 在需要它的系统上 插入一个 阻止处理器重新排序内存的内存屏障 操作如下 如果在该方法之后出现读或写 代码 处理器无法移动它before这个方法 and Volatile Write
  • 在 C# 中使用“using”关键字避免多次处置的最佳实践

    当变量是 IDisposable 时 我们有using关键字来管理处置 但是如果我们在方法中返回值怎么办 using twice StringContent stringToStringContent string str using St
  • c# 从另一个类中的另一个静态事件引发事件

    需要帮助从另一个班级调用事件 我有已声明事件的课程 public class MxPBaseGridView GridView public event AddNewItemsToPopUpMenuEventHandler AddNewIt
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • C++ 将联合强制转换为其成员类型之一

    以下对我来说似乎完全符合逻辑 但不是有效的 C 联合不能隐式转换为其成员类型之一 有人知道为什么不这样做的充分理由吗 union u int i char c function f int i int main u v v i 6 f v
  • 有什么方法可以重载 C# 中的扩展方法吗?

    我有以下模型模式 public abstract class PARENTCLASS public class CHILD A CLASS PARENTCLASS public static class EXTENSION public s
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 用于连接 DataTable 上的动态列的动态 LINQ

    我目前遇到的情况不确定如何继续 我有两个从数据库填充的数据表 我还有一个可用的列名称列表 可用于将这两个数据表连接在一起 我希望编写一组 LINQ 查询 这些查询将 显示两个数据表中的行 内部联接 用于从一个数据表更新另一个数据表 显示一个
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • 无法为 wsdl 文件创建服务引用

    I have wsdl文件和xsd我本地机器上的文件 我想在项目中添加服务引用 我没有网络服务 我只有wsdl file 我收到以下错误 The document was understood but it could not be pro
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • 无法在 C# 中为 EventArgs 分配使用派生类型的事件处理程序

    所以我有一个事件声明如下 public event EventHandler OnChangeDetected 然后我有以下处理程序被分配给该事件 myObject OnChangeDetected OnTableChanged 我的理解是
  • “必须声明标量变量”错误[重复]

    这个问题在这里已经有答案了 必须声明标量变量 Id SqlConnection con new SqlConnection connectionstring con Open SqlCommand cmd new SqlCommand cm
  • 这种尺寸对齐是如何工作的

    对于所提供的评论 我无法理解以下代码 这段代码的作用是什么 以及等效的代码是什么8 aligned segment size must be 4 aligned attr gt options ssize 3 Here ssize is o
  • SQL Server“未找到网络路径”在不同环境中随机且不频繁地发生

    类似 如果不是同一个问题 随机遇到网络路径未找到异常 https stackoverflow com questions 38696448 network path not found exception encountered rando
  • 为什么表达式 a = a + b - ( b = a ) 在 C++ 中给出序列点警告?

    以下是测试代码 int main int a 3 int b 4 a a b b a cout lt lt a lt lt a lt lt lt lt b lt lt b lt lt n return 0 编译此命令会出现以下警告 gt g

随机推荐

  • lammps案例:液体平衡态rdf计算模拟练习

    分享一个2维液态平衡模拟案例代码 随机生成400 0 8个原子并进行温度初始化 原子在LJ力场作用下运动到一定位置后达到平衡 并输出rdf数据 代码已经注释 以供参考 当原子数量超过400 0 9时 体系接近固态 可自行更改参数并结合rdf
  • scrapy_redis配置redis集群

    单节点的redis太容易挂了 总是出现意外情况 借助scrapy redis sentinel库实现scrapy redis对redis集群的使用 按照官方库的说明去修改后启动项目会报错 报错的原因其实是作者的源码包中一个叫queue py
  • 修改Fedora 25与Windows 10的默认启动顺序

    首先贴出Fedora25下 boot grub2 grub cfg的内容 DO NOT EDIT THIS FILE It is automatically generated by grub2 mkconfig using templat
  • 看完这篇 教你玩转渗透测试靶机vulnhub——DC6

    Vulnhub靶机DC6渗透测试详解 Vulnhub靶机介绍 Vulnhub靶机下载 Vulnhub靶机安装 Vulnhub靶机漏洞详解 信息收集 暴力破解 漏洞发现 漏洞利用 nmap脚本提权 获取flag Vulnhub靶机渗透总结 V
  • Unity显示被遮挡的模型

    具体显示为这个效果 同事在网上找了一个受光的材质 Shader Custom RoleShader Properties Color Color Color 1 1 1 1 MainTex Albedo RGB 2D white Gloss
  • 一文彻底搞懂 MYSQL分库分表方案

    MYSQL分库分表方案 垂直分表 把一部分表字段放入一张表 另一部分放入其他的表 按照表字段的使用频次分门别类的划分 例如 在商品列表查询时 列表中只是展示部分字段 同时这个列表查询比详情信息查询更加高频 并不需要把所有字段都展示 我们可以
  • 可信执行环境(TEE):深入探讨安全计算的未来

    摘要 本文将详细介绍可信执行环境 TEE 的概念 原理和功能 我们将讨论TEE的应用场景 以及如何使用TEE来保护敏感数据和代码的安全 此外 我们还将探讨TEE的挑战和未来发展 1 引言 随着计算设备的普及和云计算技术的快速发展 如何保护数
  • python b 'string'

    str literals a sequence of Unicode characters UTF 16 or UTF 32 depending on how Python was compiled bytes b literals a s
  • 软件测试之自动化测试

    目录 1 什么是自动化测试 2 selenium java环境搭建 3 熟悉selenium的API 定位元素 添加等待 打印信息 浏览器的相关操作 键盘组合键用法 鼠标事件 特殊场景 定位一组元素 多层框架定位 下拉框处理 弹窗处理 上传
  • MATLAB算法实战应用案例精讲-【深度学习】归一化

    目录 归一化基础知识点 1 什么是归一化 2 为什么要归一化
  • Linux中部署软件时提示空间不足的应急方案

    1 df h 查看剩余空间 2 我们看到 home 下面的空间有很多 注 如果 home 下的控件时充足 且可以分配出去多余的空间 可以继续往下看 如自己 不够用或不够往外分配 可以外接新硬盘 3 在根号下执行 cp r home home
  • 【深度学习标注数据处理】imgaug Augment Polygons 对标注图片和 polygon 的数据增强

    对于本地化进行图像的增强 大家都是非常好操作的 但是 对于标注信息一起增强 还是稍微有一些难度的 麻烦很多 我是遇到一个数据集非常少的任务 只有40张图 就直接标记了去训练 发现几乎不拟合 当然这里使用的是yolo v8 而不是UNet 于
  • Gson的使用

    1 添加Gson 库 右键app open module settings dependncies com goolel code gson gson 2 2 4 2 对象转Json 保存至文件 使用Misc中的方法 Misc gson s
  • 3.2 图像分类

    文章目录 LeNet 小图像 LeNet在手写数字识别上的应用 LeNet在眼疾识别数据集iChallenge PM上的应用 数据集准备 查看数据集图片 定义数据读取器 启动训练 AlexNet 大图像 VGG 深度 GoogLeNet 深
  • 基于变分模态分解和麻雀算法优化长短期记忆网络的多维时间序列预测,VMD-SSA-LSTM多维时间序列预测。MATLAB代码(含LSTM、VMD-LSTM、VMD-SSA-LSTM三个模型的对比)

    clc clear all close all VMD SSA LSTM多维时间序列预测 tic load data mat load vmd data mat load LSTM mat disp disp VMD SSA LSTM预测
  • sqli-labs/Less-18

    这一关和前面的所有关卡都不一样 我们试一试先成功登录进去看看 结果除了iD地址之外还有一个信息回显了 那就是user agent所以我们抓包试一试 抓包后再user agent注入试试看 我尝试了许多注入方法 发现大部分方法都不能看出我注入
  • jdk、jre环境变量配置

    1 jdk和jre的区别 jdk Java 开发工具包 jre Java 的运行环境 只需这么记就可以了 想深入了解得自行查询相关资料 2 jdk是包含jre的 所以只需下载jdk 官方网址 https www oracle com cn
  • QT样式翻译

    Qt4 7文档翻译 Qt样式单参考 Qt Style Sheets Reference 转载于 http 2845385 blog 51cto com 2835385 1080560 0 tsina 1 14777 397232819ff9
  • 深入理解warp shuffle

    warp shuffle 相关函数学习 shfl up sync 0xffffffff lane val i 是CUDA函数之一 用于在线程束内的线程之间交换数据 其中 0xffffffff是掩码参数 指示线程束内所有线程都参与数据交换 一
  • C++线程处理函数的返回值

    引言 关于线程处理函数 常见的可能是返回值为void类型 那线程处理函数是否能定义自己想要的返回值类型呢 这里请看下面的说明 C 线程返回值 应用环境 1 传统的方式获取线程返回值 2 使用C Promise和future方式 3 prom