多个调用异步,用于C++中的更新向量或列表
Multiple Call Async for update vector or list in C++
我陷入了多个这样的异步问题 例:
void updateList(vector<int> &list, int value){
list.push_back(value);
}
int main(){
vector<future<void>> asyncTasks;
vector<int> list;
for(int i = 0; i < 10; i ++){
asyncTasks.push_back(async(launch::async, updateList,i ));
}
for(auto &&f : asyncTasks){
f.get();
}
}
问题是有时它会抛出有关插入暴力的错误。
你能给我任何想法吗?
问题是你在updateList
中同时做两件事:
- 根据给定的指数计算值(计算是指仅使用它(
- 向容器添加值
并行执行第二个没有多大意义,因为您必须在容器上进行序列化,否则会出现数据争用,这就是错误的原因。
void updateList(vector<int> &list, int value){
list.push_back(value); //< Data race-> Undefined behavior -> Sometimes Crash
}
但是我们可以做一些可以轻松并行的事情,即 1. 计算一个值。 如果我们只是在容器中添加虚拟零,首先,我们可以修改容器中的元素,即std::vector
,因为我们不修改容器本身,如计数或排序,只修改它的成员。
因此,在那之后,您可以并行计算,但为什么不直接使用新的并行算法为我们执行此操作呢?所以我添加了第二个解决方案。
此外,你的工作由无法平行的工作和可以平行的工作组成的发现,可以在阿姆达尔定律中找到。
#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
#include <execution>
#include <future>
//Your modified solution
void updateList(std::vector<int> &list, int value){
const auto index = value;
//Do the heavy stuff here
list[index] = value;
}
int main(){
std::vector<int> list(10);
std::vector<std::future<void>> asyncTasks;
for(int i = 0; i < 10; i ++){
asyncTasks.emplace_back(std::async(std::launch::async, &updateList, std::ref(list), i));
}
for(auto &f : asyncTasks){
f.get();
}
std::for_each(list.begin(),list.end(), [](auto v) {std::cout << v << " ";});
std::cout << "n";
}
//Better solution:
int heavy_work_calculation(int input) {
//Do the heavy stuff here
return input;
}
int main(){
std::vector<int> list(10);
std::iota(list.begin(), list.end(), 0);
std::transform(std::execution::par_unseq, list.begin(), list.end(),
list.begin(), heavy_work_calculation);
std::for_each(list.begin(),list.end(), [](auto v) {std::cout << v << " ";});
std::cout << "n";
}
相关文章:
- 如何在 C++11 中查找和更新向量中的一个嵌套结构
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 对于C++中的每一个都无法更新向量
- C++:更新类的向量成员变量
- 如何在C++中从一个向量元素减去std::unorderede_map向量元素并更新它
- 在构造函数中更新指针向量时出现问题
- 多个调用异步,用于C++中的更新向量或列表
- GUI滑块的动态数量,该数量更新具有回调中值的std ::向量
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 更新排序向量的一个条目
- 更新存储在地图中的向量的向量
- 迭代向量以更新word_counter
- 如何在不复制的情况下更新 std::unordered_map<std::string, std::vector> 中的向量<int>?
- 根据索引向量对向量重新排序 - 更新
- 为向量成员和更新元素指定默认值
- 如何比较两个向量中的两个值,然后在C++中更新向量值
- 如何在方法中更新向量
- 更新C++向量中的所有元素
- C++ 我无法从函数内更新向量