假设我有一个函数,日志转换一个向量,乘以一个常量,因此我定义了一个函数,给定了向量和常量....
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类型,如何使用多线程同时执行该函数?
答案 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来获取结果。