は、私の知る限り、非同期タスクのライブラリー、その後ハンドルを理解しますそれらは の並列リクエストを受信します。つまり、メインの スレッドがすべてのタスクをイベントのように処理するのではなく、むしろ ライブラリがそのタスクをいくつかの基底のスレッドプールに割り当てます(--to me intransparent- - )方法。私はそれを正しいものにしましたか?
はい、REST SDKでは、スレッドプールを使用してタスクの継続を開始します。ウィンドウでは、Windows API ThreadPool関数(CreateThreadPool
、TrySubmitThreadpoolCallback
など)を使用します。 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++プラットフォームから期待しています。
いい回答です、ありがとうございます!さらに2つの質問:(i)ロードバランシングはどうですか? 1つのリクエストには大きな応答があり、99のリクエストには小さなものがあるとします。 pplはこれを正しく処理しますか? (ii)フォローアップ:別のstd :: threadsで非同期タスクを使用すると、各スレッドは独自のスレッドプールを持つでしょうか? ...それはカスタムバランシングを実装するために使用できますか? – davidhigh
(i)sort of。基礎となるスレッドプールの実装に依存します。 (ii)いいえ、プラットフォームには常にスレッドプールが1つしかありません –
カスタムロードバランシングは不可能ですか? – davidhigh