我是 C 新手,不知道如何讓主執行緒等待所有異步執行緒完成。我提到了這一點,但使 void consume() 不平行。
#include <iostream>
#include <vector>
#include <unistd.h> // sleep
#include <future>
using namespace std;
class Myclass {
private:
std::vector<int> resources;
std::vector<int> res;
std::mutex resMutex;
std::vector<std::future<void>> m_futures;
public:
Myclass() {
for (int i = 0; i < 10; i ) resources.push_back(i); // add task
res.reserve(resources.size());
}
void consume() {
for (int i = 0; i < resources.size(); i ) {
m_futures.push_back(std::async(std::launch::async, &Myclass::work, this, resources[i]));
// m_futures.back().wait();
}
}
void work(int x) {
sleep(1); // Simulation time-consuming
std::lock_guard<std::mutex> lock(resMutex);
res.push_back(x);
printf("%d be added.---done by %d.\n", x, std::this_thread::get_id());
}
std::vector<int> &getRes() { return res;}
};
int main() {
Myclass obj;
obj.consume();
auto res = obj.getRes();
cout << "Done. res.size = " << res.size() << endl;
for (int i : res) cout << i << " ";
cout <<"main thread over\n";
}
當 res = 0 時,主執行緒結束。我希望在將所有結果添加到 res 時執行 obj.getRes()。
Done. res.size = 0
main thread over
4 be added.---done by 6.
9 be added.---done by 11...
uj5u.com熱心網友回復:
您對注釋掉的行有正確的想法:m_futures.back().wait();,您只是將其放在錯誤的位置。
正如您所注意到的,啟動 astd::async然后立即等待其結果會強制整個事情連續執行并使異步變得毫無意義。
相反,您需要兩個功能:一個,就像您consume()啟動所有異步的一樣,然后另一個回圈期貨并在它們上呼叫wait(或get任何適合您的需要) - 然后從main.
這讓它們都可以并行運行,同時仍然main等待最終結果。
uj5u.com熱心網友回復:
除了@Frodyne 的回答,
consume()函式呼叫是并行的,主執行緒等待所有consume()s 完成作業;
void set_wait(void)
{
for (int i = 0; i < resources.size(); i ) {
m_futures[i].wait();
}
}
并在這里呼叫它
void consume() {
for (int i = 0; i < resources.size(); i ) {
m_futures.push_back(std::async(std::launch::async, &Myclass::work, this, resources[i]));
// Calling wait() here makes no sense
}
set_wait(); // Waits for all threads do work
}
為方便起見,我創建了新功能。
uj5u.com熱心網友回復:
您可以在添加任務后使用std::future:waitm_futures。例子。
void consume() {
for (int i = 0; i < resources.size(); i ) {
m_futures.push_back(std::async(std::launch::async, &Myclass::work, this, resources[i]));
//m_futures.back().wait();
}
for(auto& f: m_futures) f.wait();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/528329.html
標籤:C 异步
下一篇:如何在回圈中命令Ajax呼叫
