c++ 如何异步处理unordered_map的部分内容?

f45qwnt8  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(115)

对于unordered_map〈string,string〉中的每一对,我需要调用处理函数。它不返回任何东西,也不以任何方式更改数据。如何使用std::async或std::thread异步处理map部分?
我本来想做这样的事

unordered_map<string, string> m = Init();
vector<std::thread> threads;

for (size_t i = std::thread::hardware_concurrency(); i > 0; --i) {
    // for loop ???
    threads.emplace_back(do_smth, it); // Here it is iterator of element in m
  
}

while (!threads.empty()) {
     if (threads.back().joinable()) {
        threads.back().join();
     }
     threads.pop_back();
}

但是应该用什么来代替// for循环呢???

gcmastyq

gcmastyq1#

作为第一步,我会创建:

  • 并发队列
  • 线程池

主线程将把项目推到队列中。其他线程将执行以下操作:

while (queue.pop(item))
    process(item);

在你把所有的真实的项都推到队列中之后,你可以(有一种可能性)推N(=线程数)个虚拟项。尝试弹出一个虚拟项返回false

gjmwrych

gjmwrych2#

你没有说明你的项目使用的是哪种c标准。但是如果你至少有c17,这个问题很容易通过使用std库来解决(但是没有std::async或std::thread,如果这对你来说不是一个硬性要求的话):

#include <unordered_map>
#include <string>
#include <algorithm>
#include <execution>
#include <iostream>

void exec(std::pair<std::string,std::string> p) { // your processing function
    std::cout << "executing " << p.first << " : " << p.second << "\n";
}

int main () {
    std::unordered_map<std::string,std::string> m=
    {{"a","A"},{"b","B"},{"c","C"},{"d","D"},};

std::for_each(std::execution::par,m.cbegin(),m.cend(),exec);
}

您可以看到此解决方案的实际应用here

相关问题