2017-02-18 12 views
1

非同期で複数のメソッドを呼び出す必要があります。以下に簡単な例を示します。C++での複数の非同期呼び出し

size_t counter(std::string &s) 
{ 
    return s.size(); 
} 

void stringCountAccumulator() 
{ 
    std::vector<std::string> foos = {"this", "is", "spartaa"}; 
    size_t total = 0; 
    for (std::string &s : foos) 
    { 
     std::future<size_t> fut = std::async(
      std::launch::async, 
      counter, s); 

     total += fut.get(); 
    } 
    std::cout << "Total: " << total; 
} 

fut.get()は今後のその他の呼び出しをブロックしているようです。どのように私はこの問題をC++で実装できますか?私は別のスレッドで関数を呼び出す必要があります。この関数は値を返す。

答えて

2
void stringCountAccumulator() 
{ 
    std::vector<std::string> foos = {"this", "is", "spartaa"}; 
    std::vector<std::future<size_t>> calcs; 
    for (auto&& s : foos) { 
    calcs.push_back(std::async(
     std::launch::async, 
     counter, s) 
    ); 
    } 
    std::size_t total = 0; 
    for (auto&& fut:calcs) 
    total += fut.get(); 
    std::cout << "Total: " << total << "\n"; 
} 

.get()がブロックしています。ですから、あなたがすべてのタスクをキューに入れるまでブロックしないでください。

代わりに、スレッドプールを作成/検索し、各タスクにアトミック(またはミューテックスで保護された)カウンタを更新させることもできます。

完成したタスクカウンターをガードしました(再び、おそらくアトミック)。

最後のタスクが完了したとき(最後のタスクが完了したとき)に実行することを約束します(合計)。

その約束から将来を返す。今度は、スレッドのプール全体を表現してその価値を計算し、それを追加して、並行性を高めた未来があります。

いくつかのフレームワークは、Microsoftのpplのように、あなたのためにこのような処理を行うシステムを持っています。値を返すタスクと、値を組み合わせた関数オブジェクトがあり、それらの組み合わせの結果を取得します。

1

C++ threads for background loadingをご覧ください。完成したタスクの結果を得る方法を説明します。

+0

ありがとう、私はそれをチェックします。コールバックのメカニズムはありませんか?タスクが完了したかどうかを確認する必要がありますか? –

+0

はい、タスクが完了したかどうかを手動で確認する必要があります。 –

1

また、StringCountAccumulator()が非同期に実行されることを宣言する必要があります。また、future :: get()を呼び出すには、未来が準備できているときだけです。コードスニペットは次のとおりです。

std::future<void> stringCountAccumulator() 
{ 
    std::vector<std::string> foos = {"this", "is", "spartaa"}; 
    size_t total = 0; 
    for (std::string &s : foos) 
    { 
     std::future<size_t> fut = std::async(
      std::launch::async, counter, s); 
     while (!fut.is_ready()) ; 
     total += fut.get(); 
    } 
    std::cout << "Total: " << total; 
    } 
+0

これは 'future'を返しますが、return文はどこにありますか? – smac89

関連する問題