我使用 libcurl share+easy interface,我需要“修复”一些由网络服务器设置的 cookie 信息。 在我的例子中,我使用了多个线程,我想知道什么时候接收到的 cookie 被“共享”给所有其他 curl 句柄,以及何时是修复接收到的 cookie 数据的正确时间:
- 就在我从远程服务器收到它时(但此时我不确定损坏的 cookie 数据是否可能被同时发出新 http 请求的其他线程获取)
- 关于发出新请求以确保我最终不会在新的 http 请求中使用损坏的 cookie。
这是我的代码流程。我调用 curl_easy_perform
。当包含 Set-Cookie
的响应进来时,libcurl 首先解析该 cookie 并将其存储在其内部存储中(在 curl 共享接口(interface)的情况下共享)。
然后 curl_easy_perform
返回,现在我尝试检查服务器是否发送我需要“修复”的特定 cookie。要检查该 cookie,唯一的方法是使用 CURLINFO_COOKIELIST
。
我的问题是:从 curl 解析传入的 Set-Cookie
header (带有无效的 cookie 数据)到我使用 CURLINFO_COOKIELIST
检查更新后的无效 cookie 的时间可能会被另一个线程拾取。这意味着为了避免这个问题,除了在每个新请求上检查 cookie 之外,我看不到任何其他选项,以防万一有另一个线程可能使用无效数据更新了 cookie。
即使在这种情况下,我仍然可能最终使用无效的 cookie 数据。换句话说,这个问题没有合适的解决方案。
什么是正确的方法?
最佳答案
通常在多线程中使用 libcurl 时,您在每个线程中使用一个句柄,它们不共享任何东西。然后,您何时修改 cookie 并不重要,因为每个句柄(以及线程)都是独立运行的。
如果你让线程共享 cookie 状态,就像共享接口(interface)一样,那么你就有了锁定互斥锁设置,可以保护数据对象不被多个线程同时访问,这样你就可以继续更新 cookie随时使用正确的 API。
如果您使用多接口(interface),它会在同一个线程中进行并行传输,因此您可以随时更新 cookie,而不会出现任何并行问题。
关于CURL 在多线程应用程序中共享接口和 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46285383/