17

我正在尝试通过使用 std::async 来加速程序。假设我有一个功能

T* f (const T& t1, const T& t2, const T& t3)

其中 T 是一种复制成本很高的类型。我有几个具有不同参数的 f 独立调用,我尝试将它们与 std::async 并行化,大致如下:(其中 m_futures 是正确类型的期货的 std::vector)。

for (...) {
   m_futures.push_back (
       std::async(
           std::launch::async,
           f,
           a,b,c));
}

我观察到上面的代码减慢了我的程序的执行速度。我用 gdb 逐步完成了它,当创建未来时,T 的复制构造函数被调用了 3 次。这是为什么?参数 a,b,c 是堆分配的,但编译器可能不知道吗?我可以以某种方式使其明确吗?

std::async 创建参数的副本是否总是如此,即使它们应该通过 const 引用传递?我能以某种方式避免这种情况吗?在我天真的想法中,应该只传递一个指向函数的不同调用的指针(无论如何它只能从内存中读取。)如果这很重要,我在 Linux 上使用 gcc-4.6.3。

4

1 回答 1

21

只存储引用是不安全的,因为没有什么可以保证不存在数据竞争(更深刻的是,对象的存在,正如@utapistim 在她可悲地删除的帖子中所说)。

如果你真的想要一个参考而不是一个副本,并且愿意赌上你的生命是正确的,那么你可以简单地使用一个参考包装器:

std::async(std::launch::async, f, std::cref(a), std::cref(b), std::cref(c))
于 2013-02-13T10:19:52.827 回答