我已经在ubuntu 20.04和gcc 9上成功地使用了std::execution::par_unseq策略。然而,我遇到了一个奇怪的行为,它不适用于地图,但适用于矢量
示例1:
typedef std::map<std::string, std::vector<std::shared<Foo>>> ProblemsType;
ProblemsType values;
FillValues(values);
std::for_each(std::execution::par_unseq, values.begin(), values.end(), [](ProblemsType::value_type value) {
// Do something
}
示例2:
typedef std::map<std::string, std::vector<std::shared<Foo>>> ProblemsType;
ProblemsType values;
FillValues(values);
std::vector<std::pair<std::string>, std::vector<std::shared<Foo>>> valuesAsVector;
FillVectorWithMapValues(valuesAsVector, values);
std::for_each(std::execution::par_unseq, valuesAsVector.begin(), valuesAsVector.end(), [](std::pair<std::string>, std::vector<std::shared<Foo>> value) {
// Do something
}
#1不起作用,但2起作用。我通过观察htop的cpu使用情况进行了检查,发现#2使用了所有内核(以及几个线程(。对于#1,只使用了一个核心。
我检查了std::map::迭代器是一个满足LegacyForwardIterator的LegacyBidirectionIterator。
std::map阻止使用执行策略par_unseq有什么特别之处吗?
std::map是否有任何特殊之处阻止使用执行策略par_unseq?
您没有阻止使用par_unseq
,可能实现选择不做任何与非策略重载不同的事情。
这是一个实施质量问题,即实施是否与政策赋予的额外自由有所不同