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*/});
}

(for-loop只是表示请求经常发送,我并没有真正在我的代码中使用它)。

问题:

  • 据我了解,异步任务库然后以并行方式处理这些传入请求 - 这意味着不是主线程以类似事件的方式处理所有任务,而是该库将任务分配给某些底层线程池(——对我来说是不透明的——)方式。我说对了吗?

  • 如果前面的观点是正确的,那么还有什么理由将 REST SDK 与 C++ 的多线程能力结合起来。例如,再次采用上述循环,启动 10 个线程,并在每个进程中进行 10 次循环迭代。这有意义还是没有必要?

  • 此外,一般来说,是否有任何常见的模式应该通过 C++11 多线程特性结合 ppl 功能?或者,依靠 REST SDK 和 ppl 来更好地完成工作是否安全?

(信息:我也在cpprest 讨论页面上问过这个问题。但是,这个论坛似乎不再维护了。)

4

1 回答 1

6

据我了解,异步任务库然后以并行方式处理这些传入请求——这意味着不是主线程以类似事件的方式处理所有任务,而是该库在某些情况下将任务分配给底层线程池(——对我来说是不透明的——)方式。我说对了吗?

是的,在 REST SDK 中,它们使用线程池来启动任务延续。在 Windows 上,它们使用 Windows API ThreadPool 函数(CreateThreadPoolTrySubmitThreadpoolCallback)。在 Linux 上,他们使用 Boost 版本。

如果前面的观点是正确的,那么还有什么理由将 REST SDK 与 C++ 的多线程能力结合起来。例如,再次采用上述循环,启动 10 个线程,并在每个进程中进行 10 次循环迭代。这有意义还是没有必要?

完全没有必要,该平台有自己的线程池。

此外,一般来说,是否有任何常见的模式应该通过 C++11 多线程特性结合 ppl 功能?或者,依靠 REST SDK 和 ppl 来更好地完成工作是否安全?

好吧, a 的整个想法task是抽象出线程的使用。在处理许多并行任务时,线程不能很好地扩展。传统的方法是使用线程池不为每个新任务生成一个新线程。

ppl tasks 使您能够以更优雅的方式处理异步 IO。您将 CPU 绑定任务封装在 中ppl::task,在这些任务中,您可以生成另一个异步 IO 操作,并ppl::task::then在异步 IO 完成后用于继续执行 CPU 绑定任务。

该机制是一个链task-> aync IO -> continuation task-> async IO ->task等等。当任务启动 IO 操作时,底层线程池将继续执行下一个任务。当异步 IO 完成时,它将继续任务排在线程池任务队列的末尾。

所以不,你不应该直接std::thread自己创建任何东西。但是,您确实希望使用同步对象,例如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 回答