4

これは、C++ REST SDK の非同期タスク機能に関する概念的な質問です (また、少し初歩的な質問でもあるかもしれません)。

基本的なアプリケーションでは、クライアントがあり、いくつかのリクエストを実行します。

http_client client(U("whatever"));

for(int i=0; i<100; ++i)
{
    http_request request;
    //fill the request
    client.request(request).then([](http_response response) { /* do something*/});
}

(foo ループは、リクエストが頻繁に送信されることを示すためのものであり、コードでは実際には使用しません)。

質問:

  • 私が理解している限りでは、非同期タスク ライブラリはこれらの着信要求を並列に処理します。つまり、メイン スレッドがすべてのタスクをイベントのような方法で処理するのではなく、ライブラリがいくつかの基になるスレッド プールにタスクを割り当てます。 (--私には透明ではありません--) 方法。私はそれを正しく理解しましたか?

  • 前の見解が正しければ、REST SDK を C++ のマルチスレッド機能と組み合わせる理由はあります。たとえば、上記のループをもう一度取り上げると、10 個のスレッドを開始し、それぞれのプロセスで 10 回のループ反復を実行します。これは理にかなっていますか、それとも不要ですか?

  • さらに、一般的に、C++11 のマルチスレッド機能によって ppl 機能を組み合わせる必要がある一般的なパターンはありますか? それとも、内部の REST SDK と ppl がより良い仕事をしてくれると信頼しても安全でしょうか?

(情報: cpprest ディスカッション ページでもこの質問をしました。ただし、このフォーラムはもう維持されていないようです。)

4

1 に答える 1

6

私が理解している限りでは、非同期タスク ライブラリはこれらの着信要求を並列に処理します。つまり、メイン スレッドがすべてのタスクをイベントのような方法で処理するのではなく、ライブラリがいくつかの基になるスレッド プールにタスクを割り当てます。 (--私には透明ではありません--) 方法。私はそれを正しく理解しましたか?

はい、REST SDK では、スレッドプールを使用してタスクの継続を起動します。Windows では、Windows API ThreadPool 関数 ( など) を使用しCreateThreadPoolますTrySubmitThreadpoolCallback。Linux では、Boost を使用します。

前の見解が正しければ、REST SDK を C++ のマルチスレッド機能と組み合わせる理由はあります。たとえば、上記のループをもう一度取り上げると、10 個のスレッドを開始し、それぞれのプロセスで 10 回のループ反復を実行します。これは理にかなっていますか、それとも不要ですか?

完全に不必要ですが、プラットフォームには独自のスレッド プールがあります。

さらに、一般的に、C++11 のマルチスレッド機能によって ppl 機能を組み合わせる必要がある一般的なパターンはありますか? それとも、内部の REST SDK と ppl がより良い仕事をしてくれると信頼しても安全でしょうか?

a の全体的な考え方は、taskスレッドの使用を抽象化することです。多くの並列タスクを処理する場合、スレッドはうまくスケーリングしません。従来のアプローチは、スレッド プールを使用して、新しいタスクごとに新しいスレッドを生成しないようにすることです。

ppl タスクを使用すると、より洗練された方法で非同期 IO を処理できます。で CPU バウンド タスクをカプセル化しますppl::task。これらのタスクでは、別の非同期 IO 操作を生成ppl::task::thenし、非同期 IO が終了したときに CPU バウンド タスクを続行するために使用できます。

メカニズムはチェーンなどtask-> aync IO -> continuation task-> async IO ->taskです。タスクが IO 操作を開始すると、基になるスレッド プールが次のタスクに移動します。非同期 IO が終了すると、スレッド プール タスク キューの最後に継続タスクがキューに入れられます。

いいえ、自分で直接作成しないstd::threadでください。ただし、タスクが shread リソースにアクセスする std::mutex 場合のように、同期オブジェクトを使用する必要があります。

------------------------------------
おまけ:
Visual Studio 2015 RTM 以降の VC++ では、タスクで使用awaitして、次のものを取り除くことができthenます。

http_client client(U("whatever"));

for(int i=0; i<100; ++i)
{
    http_request request;
    //fill the request
   auto response = await client.request(request);
   //do something with the response
}

-------------------------------------------------- -
悪いボーナス:
REST SDK での私の経験では、そのパフォーマンスは非常に低く、C++ プラットフォームに期待するものではありません。

于 2016-03-31T15:57:39.037 に答える