2016-03-31 35 views
2

これはC++ REST SDKの非同期タスク機能に関する概念的な質問です(また多少の質問もあります)。C++ REST SDK:非同期タスクとC++ 11マルチスレッドの比較

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

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

質問:

  • 私の知る限り理解し、非同期タスクライブラリは、パラレルな方法でこれらの着信要求を処理します - ないメインスレッドがイベント状にすべてのタスクを処理することを意味しますが、むしろ、ライブラリは、いくつかの( - 私の透明な - )方法で基底のスレッドプールにタスクを割り当てます。私はそれを正しいものにしましたか?

  • 前のビューが正しい場合は、REST SDKとC++のマルチスレッド機能を組み合わせる必要があります。たとえば、上記のループをもう一度取って、10個のスレッドを開始し、それぞれのループで10個のループを繰り返します。これは理にかなっていますか、それとも不要ですか?

  • また、一般的に、ppl-capabilitiesをC++ 11のマルチスレッド機能と組み合わせるべきパターンがありますか?それとも、REST SDKとpplを使って仕事をよりうまくやってくれるのを信頼するのは安全ですか?

(情報:私はcpprest discussion pageにも、この質問をしてきましたが、このフォーラムはもう維持されていないことのようです。。)

答えて

2

は、私の知る限り、非同期タスクのライブラリー、その後ハンドルを理解しますそれらは の並列リクエストを受信します。つまり、メインの スレッドがすべてのタスクをイベントのように処理するのではなく、むしろ ライブラリがそのタスクをいくつかの基底のスレッドプールに割り当てます(--to me intransparent- - )方法。私はそれを正しいものにしましたか?

はい、REST SDKでは、スレッドプールを使用してタスクの継続を開始します。ウィンドウでは、Windows API ThreadPool関数(CreateThreadPoolTrySubmitThreadpoolCallbackなど)を使用します。 LinuxではBoostを使います。

前のビューが正しい場合は、REST SDKとC++のマルチスレッド機能を組み合わせる必要があります。 の例では、上記のループをもう一度取って、10個のスレッドを開始し、それぞれを個のループを繰り返し処理します。これは意味がありますか、それとも は不要ですか?

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

さらに、一般的には、 はC++ 11マルチスレッド機能によって結合されなければならないパターンがありますか?または REST SDKとpplがフードの下で ジョブがうまくいっていることに頼っても安全ですか?

よく、taskの全体のアイデアは、スレッドの使用を抽象化することです。多くの並列タスクを使用してスレッドを処理すると、スレッドのスケーラビリティが向上しません。従来のアプローチでは、スレッドプールを使用して新しいタスクごとに新しいスレッドを生成しません。

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

task-> aync IO -> continuation task-> async IO ->taskのような機構である。タスクがIO操作を開始すると、基底のスレッドプールは次のタスクに移動します。非同期IOが終了すると、スレッドプールタスクキューの最後に継続タスクがキューイングされます。

だから、自分で直接std::threadを作成しないでください。しかし、std::mutexのようなsyncrhonizationオブジェクトを使用したい場合は、あなたのタスクは任意のshreadリソースにアクセスします。

------------------------------------
良いボーナス:
on VC++ Visual Studioの2015以上のRTMと、あなたは、タスクに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++プラットフォームから期待しています。

+0

いい回答です、ありがとうございます!さらに2つの質問:(i)ロードバランシングはどうですか? 1つのリクエストには大きな応答があり、99のリクエストには小さなものがあるとします。 pplはこれを正しく処理しますか? (ii)フォローアップ:別のstd :: threadsで非同期タスクを使用すると、各スレッドは独自のスレッドプールを持つでしょうか? ...それはカスタムバランシングを実装するために使用できますか? – davidhigh

+0

(i)sort of。基礎となるスレッドプールの実装に依存します。 (ii)いいえ、プラットフォームには常にスレッドプールが1つしかありません –

+0

カスタムロードバランシングは不可能ですか? – davidhigh

関連する問題