【发布时间】:2012-04-21 00:02:07
【问题描述】:
有人对相当新的std::async 有经验吗?我们目前正在实现一个并行文件解析器,它读取一个文件块并将这个块传递给一个异步函数。
以这种方式使用 Clang (v3.0) 与默认的 std::async 策略(依赖于实现)一起工作非常好。在两核机器上,它可以触发多达 4 个线程,效果非常好。
但是使用 GCC (v4.7),文件读取线程不会产生任何新线程,从而使程序最终完全顺序。
使用std::launch::async,两个版本几乎都在做同样的事情(应该是什么情况)。
有谁知道 GCC 的 c++11 线程能力的当前状态?或者这可能是我们的实现中的一个错误?
短代码:
while (readNewChunk()) {
Chunk &chunk = fileReader_.getChunk(); //reading the file
ChunkLoader *chunkLoader = new ChunkLoader();
auto ftr = std::async(std::launch::async, &ChunkLoader::createDictionaries, chunkLoader);
dictCreationFutures_.push_back(std::move(ftr));
}
【问题讨论】:
-
我真的会推荐使用 Boost。对正确的 C++11 支持不会有很大的飞跃。 C++11 中的新线程模型需要与 GCC 或 MSVC 使用的不同的内存布局,而且它们并没有真正实现。
标签: c++ gcc c++11 clang policy