C-卷曲在多线程应用中共享接口和cookie



我使用libcurl share Easy接口,我需要"修复" Web服务器设置的一些cookie信息。就我而言,我使用多个线程,我想知道在什么时候收到的cookie是"共享"到所有其他卷发手柄的"共享",以及何时是修复收到的cookie数据的合适时机:

  • 当我从远程服务器收到它时(但是在这一点上,我不确定损坏的cookie数据是否会被其他一些同时提出新的HTTP请求的线程拾取)
  • 提出新请求以确保我不会在新的HTTP请求中使用损坏的cookie。

这是我的代码流。我致电curl_easy_perform。当包含Set-Cookie的响应进来时,首先解析并将其存储在其内部商店中(如果在curl share界面中共享)。然后curl_easy_perform返回,现在我尝试检查服务器是否发送我需要"修复"的特定cookie。要检查cookie的唯一方法是使用CURLINFO_COOKIELIST

我的问题是:从卷曲排除的传入Set-Cookie标头(带有无效的cookie数据)到我使用CURLINFO_COOKIELIST检查cookie的时间,更新的无效cookie可能会被另一个线程拾取。这意味着要避免这个问题,除了在每个新请求上检查cookie之外,如果有另一个线程可能已经更新了使用无效数据的cookie,则没有其他其他选项。即使在这种情况下,我仍然可能最终使用无效的cookie数据。换句话说,对于此问题没有适当的解决方案。

正确的方法是什么?

通常在多个线程中使用libcurl时,您在每个线程中使用一个句柄,它们不共享任何东西。然后,当您修改cookie时,每个句柄(以及线程)都独立运行。

如果您使线程共享cookie状态,例如与共享接口一样,则您进行了锁定的sutexes设置,该设置可保护数据对象免于一次从一个以上的线程访问,以便您只需继续并更新cookie并更新cookie每当您感觉到时使用正确的API。

如果您使用的是多接口,它确实会在同一线程中并行传输,因此您可以随时更新cookie,而不会冒任何并行性问题的风险。

最新更新