c++ async只使用2个内核

C++ async only uses 2 cores

本文关键字:2个 内核 async c++      更新时间:2023-10-16

我正在使用async同时运行一个方法,但是当我检查我的CPU时,它显示8个中只有2个在使用。我的CPU利用率在整个过程中大约是13%-16%。函数异步应该创建一个新的线程与每次调用,因此应该能够使用更多的处理器,或者我理解错了什么?

下面是我的代码:

for (map<string, Cell>::iterator a = cells.begin(); a != cells.end(); ++a)
{
    for (map<string, Cell>::iterator b = cells.begin(); b != cells.end(); ++b)
    {
        if (a->first == b->first)
            continue;
        if (_paths.count("path_" + b->first + "_" + a->first) > 0)
        {
            continue;
        }
        tmp = "path_" + a->first + "_" + b->first;
        auto future = async(launch::async, &Pathfinder::findPath, this, &a->second, &b->second, collisionZone);
        _paths[tmp] = future.get();
    }
}

我理解错了吗?

编辑:

谢谢大家,我现在明白了。我不知道,调用。get()在未来会等待它完成,这似乎是合乎逻辑的…

但是,我现在编辑了我的代码:

    for (map<string, Cell>::iterator a = cells.begin(); a != cells.end(); ++a)
{
    for (map<string, Cell>::iterator b = cells.begin(); b != cells.end(); ++b)
    {
        if (a->first == b->first)
            continue;
        if (_paths.count("path_" + b->first + "_" + a->first) > 0)
        {
            continue;
        }
        tmp = "path_" + a->first + "_" + b->first;
        mapBuffer[tmp] = async(launch::async, &Pathfinder::findPath, this, &a->second, &b->second, collisionZone);
    }
}
for (map<string, future<list<Point>>>::iterator i = mapBuffer.begin(); i != mapBuffer.end(); ++i)
{
    _paths[i->first] = i->second.get();
}

它的工作原理。现在它正确地生成线程并使用我所有的cpu功率。你给我省去了很多麻烦!再次感谢。

回答根本问题:

你可能应该通过分割循环来重构代码。在第一个循环中,您创建所有的期货,并将它们放入由tmp索引的地图中。在第二个循环中,遍历该映射并获取每个future的所有值,将结果存储在_paths

在第一个循环之后,你将有很多并行运行的期货,所以你的核心应该足够忙。如果cells足够大(>numCores),则只拆分内部循环可能是明智的。

std::async异步运行指定函数并立即返回。就是这样。

这取决于编译器如何做。有些编译器为每个异步操作创建线程,有些编译器有线程池。

我推荐阅读这个:https://stackoverflow.com/a/15775870/2786682

顺便说一下,你的代码并没有真正使用std::async,因为你在'产卵'异步操作后对future.get进行同步调用。

是的,你确实弄错了。并行代码需要在编写任何代码之前进行一些思考。

你的代码创建了一个future(它可能会产生一个新的线程),在那之后,你立即强制新创建的future停止(调用它的.get()方法),同步,让它返回一个结果。

因此,使用此策略,您的代码在任何时候都不会使用超过2个cpu内核。它不能。

实际上,大多数时候你的代码只使用一个核心!