【发布时间】:2015-05-08 08:18:56
【问题描述】:
我想写一个函数anyElementSatisfiesPredicate,它接受一个谓词函数p的输入(它接受一个给定类型T的对象并返回一个布尔值)和一个std::vector v T 类型的对象,当且仅当它在 v s.t. 中存在一个元素时返回 true。 p(v) == true。
这可以通过 for 循环轻松完成:
bool anyElementSatisfiesPredicate(std::function<bool(T&)> p, std::vector<T> v) {
for (auto it=v.begin(); it!=v.end(); ++it)
if (p(*it))
return true;
return false;
}
这工作正常(给定正确定义的类型 T),但我想并行化此代码,同时在向量 v 的不同元素上测试谓词函数 p。我的想法是将工作分配给固定(取决于机器)数量的内核。每个线程都应该在原始向量的不同部分评估谓词,并在发现谓词 p 在其部分中的元素上成立时立即返回 true。一旦任何给定线程返回 true,核心函数 anyElementSatisfiesPredicate 应该杀死剩余的线程并返回 true,如果所有线程最终返回 false,它应该返回 false。
由于此代码将在具有不同内核数量的不同机器上运行,我不想引入任何定义要使用的内核数量的常量,我宁愿让系统为我选择最佳值。
效率是我最关心的问题。有没有简单的方法来完成这个(也许使用 boost 线程库)?
【问题讨论】:
-
那么,就像
std::any_of一样,但是是并行的?也许可以用例如完成std::async. -
“应该杀死剩余的线程” -
std::thread不支持异步线程取消(您的底层线程实现可能,但只有在非常小心和受限的使用情况下才安全)),但是您可以设置一个标志,让其他线程每隔一段时间检查一次(例如,每次检查进一步的 n 个元素时),如果他们看到是否设置,则提前返回。除此之外,只需找到您的核心数量,并在线程返回时加入它们。 -
如果你使用 C++11,也许你可以选择 std::future
-
您可以使用任务队列之类的东西 - 每个线程将从队列中弹出最后一个元素,计算谓词并将结果放入另一个队列。主线程监视结果队列并清除任务队列以停止计算。我不确定它是否被 std lib 直接支持...
-
抱歉 - 刚刚注意到 boost 标签 - 该库确实为协作中断提供了一些便利功能:请参阅here - 与上面建议的标志相同。
标签: c++ multithreading boost-thread