开发中遇到一个需求,大致是使用C++的libcurl库发送http的post请求到指定平台网站。
首先想到的是使用curl_multi_preform异步发送post。在主线程中curl_multi_add_handle,然后创建新的线程调用curl_multi_preform发送。
这时候出现问题,curl_multi_preform发送的数据为空、或者不全、或者是一些不相关的数据。最后查到大概原因是我们在主线程中创建curl_easy,并且把要发送的字符串str放到curl_easyset_opt(curl_easy, CURLOPT_POSTFIRLDS, str.c_str)中,再调用curl_multi_add_handle(curl_multi, curl_easy)。然后再另外线程调用curl_multi_preform发送,可能在发送前,符串str在主线程已经释放掉了,导致发送的数据有问题。
解决方式就是把要发送的str用一个线程安全的queue保存在成员变量里面,然后在另外一个线程去生成curl_easy再添加到curl_multi_add_handle,最后再curl_multi_preform发送,就不会有问题。