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

  • Post author:
  • Post category:其他




引言

关于线程处理函数,常见的可能是返回值为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对象共享数据。



总结

上述方法一中,使用传递变量地址的方式,从而达到修改变量的值。

结合这篇文章,可以看出通过参数可以将想要的值获取,至于能否通过指定返回值类型返回想要的数据这里还是不太清楚,应该是不可以。还是采用参数传回想要的数据吧。