使用 curl easy 将多个线程切换为使用 curl multi 的单线程

Switching many threads using curl easy to single thread using curl multi

我在单个线程中使用 libcurl easy interface and I create lots of threads in my c++ app to handle these http requests. I would like to convert the code to use libcurl multi instead. Conceptually, the idea is clear: instead of calling blocking curl_easy_perform on each curl easy handle from multiple threads I'll call a blocking curl_multi_perform,这个内部调用将处理所有附加的 curl easy handles。

我不清楚的事情:

是否有用于从不同线程执行多个简单请求并将同一个示例转换为多接口的简单示例?

(这真的是几个问题伪装成一个问题,不太适合Whosebug。)

curl_multi_perform() 不阻塞。它现在会尽其所能,然后它 returns 并期望程序在它的时间或它的套接字之一上有 activity 时再次调用它。

理想情况下,您可以标记哪些传输在其他线程中停止,一旦 curl_multi_perform() returns 您可以从多句柄中删除所述简单句柄,它们不再在游戏。或者,当您希望传输结束时,您可以使用单个传输的回调 (write/read/progress) 到 return 错误。

可以在任何给定时刻在多个线程中使用相同的 libcurl 句柄。如果您确实需要从多个线程使用同一个句柄,那么您需要小心进行互斥。参见libcurl treading man page。通常最好从其他线程将内容放入 qeueus,并让单个使用 libcurl 的线程在可能的情况下从该队列读取句柄或操作,然后确保单线程访问句柄。

如果您通过使用 curl_multi_remove_handle() 删除句柄来中止传输,则该传输将中止。停了。您确实可以立即重复使用该手柄,如果您将其放回原处,它将被视为全新的传输,除非您更改简单手柄中的任何选项,否则它将以相同的方式从头开始再次 URL.过早中止的传输当然会得到正确处理,这可能包括在必要时关闭 TCP 连接。