是否可以多线程同时执行非void函数? (C ++)

时间:2017-08-20 21:34:51

标签: c++ multithreading function concurrency parallel-processing

假设我有一个函数,日志转换一个向量,乘以一个常量,因此我定义了一个函数,给定了向量和常量....

vector<double> logtransform(vector<double> &data, int constant){
    vector<double> image;
    for (int i = 0; i < data.size(); i++){
        image.push_back(constant*log(data[i]));
    }
    return image;
}

给定一个名为&#34; data&#34;的向量,我需要应用函数&#34; logtransform&#34;对于包含在双精度数组中的不同数量的常量,但如果函数不是void类型,如何使用多线程同时执行该函数?

2 个答案:

答案 0 :(得分:3)

使用标准库。从std::transform开始并使其正常工作:

std::vector<double> image(data.size()); // allocate all elements!
std::transform(data.begin(), data.end(), image.begin(),
    [](double val) { return constant*log(val); });

我认为这是对的,但我没有测试过。

让它工作后,将其并行化:

std::vector<double> image(data.size()); // allocate all elements!
std::transform(std::execution::par,
    data.begin(), data.end(), image.begin(),
    [](double val) { return constant*log(val); });

并行化的唯一变化是添加新的第一个参数std::execution::par。这需要C ++ 17。

答案 1 :(得分:2)

您可以使用std::future来收集其他线程的结果,如下所示:

std::vector<double> logtransform(std::vector<double> const& data, int constant)
{
    std::vector<double> image;
    image.reserve(data.size());

    std::transform(std::begin(data), std::end(data), std::back_inserter(image),
        [constant](double d){ return constant * std::log(d); });

    return image;
}

int main()
{
    std::vector<double> data = {0.3, 0.7, 0.9};

    // start a thread to do the transform
    // remember to pass data by reference using std::cref() (constant reference)
    auto future = std::async(std::launch::async, logtransform, std::cref(data), 5);

    // do something else in parallel
    for(auto i = 0; i < 10; ++i)
        std::cout << " " << i;
    std::cout << '\n';

    // collect results
    auto results = future.get(); // will wait if thread not finished

    for(auto d: results)
        std::cout << " " << d;
    std::cout << '\n';
}

注意:需要C++11

函数std::async启动一个线程来完成工作并返回一个std::future,您可以使用该https://github.com/goinnn/django-multiselectfield来获取结果。