c++多线程中使用libcurl库的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++多线程中使用libcurl库的问题相关的知识,希望对你有一定的参考价值。

我想开启五个线程,从URL队列中读取URL,并使用libcurl库下载网页源码(每个源码存在一个对应的html文件里),但是五个线程间的互斥量设置问题不太了解。目前我只在读取URL的时候设置了互斥量,但在libcurl的使用中没有加互斥量,导致五个线程同时使用libcurl中的函数。最终的后果就是源码下载乱了。比如:下载第二个URL对应的源码的时候,第一个的源码也会夹杂在其中。可能问题有点乱,我希望有人能告诉我在多线程中使用libcurl库的时候,互斥量应该加在哪里,才能顺利下载各个URL对应页面的源码。能提供给我一份符合要求的源码最好。

库本身是线程安全的,多个线程之间不要共享CURL*的句柄,应该是没有问题的. 以下是官方说法:
http://curl.haxx.se/libcurl/c/libcurl-tutorial.html 中的Multi-threading Issues:

The first basic rule is that you must never
simultaneously share a libcurl handle (be it easy or multi or whatever)
between multiple threads. Only use one handle in one thread at any
time. You can pass the handles around among threads, but you must never
use a single handle from more than one thread at any given time.
libcurl is completely thread safe, except for two
issues: signals and SSL/TLS handlers. Signals are used for timing out
name resolves (during DNS lookup) - when built without c-ares support
and not on Windows.
If you are accessing HTTPS or FTPS URLs in a
multi-threaded manner, you are then of course using the underlying SSL
library multi-threaded and those libs might have their own requirements
on this issue. Basically, you need to provide one or two functions to
allow it to function properly.
参考技术A 五个线程
可以分别对handle 加锁。
或者,实现一个handle数组,每个线程只使用自己handle的数据。
因为libcurl本身调用是有curl变量的,所以使用五个curl就保证了不会冲突追问

首先谢谢你的回答,另外

如果对handle加锁,是不是就是对整个下载源码的函数加锁啊
我有一个download()函数,句柄的初始化和源码的下载都在这个函数里面,另外这个函数在下载源码的时候还会调用一个WRITE_CALLBACK函数,能给我说说锁加在哪里么,或是给我一份代码可以么,谢谢

追答

我觉得不用加锁
你实现一个数组,里面存的是线程信息和handle的对应关系
这样 不一样的线程只取用自己的handle就可以了。
数据之间是隔离的

追问

恩恩,觉得你说的这个数组比较合理,那download函数只需要一个么?还是每个handle对应一个呢? 因为我在download函数里面写了libcurl库函数的下载方法,比如curl_easy_setopt()等语句。

追答

当然了啊
我说的handle就是pEasyHandle = curl_easy_init();
每个线程操作自己的pEasyHandle

追问

你说的当然了啊,指的是什么?
是说只需要一个download函数?所有线程和handle都用这一个函数么?

以上是关于c++多线程中使用libcurl库的问题的主要内容,如果未能解决你的问题,请参考以下文章

[C++多线程]1.3-多线程控制的另一种姿势-条件变量(condition_variable), 信号量(semaphore)

[C++多线程]1.3-多线程控制的另一种姿势-条件变量(condition_variable), 信号量(semaphore)

C++在linux下怎么多线程

C++进阶详解C++开源网络传输库libcurl的编译过程

linux c++多线程,创建两个子线程,主线程有个循环,循环内需要从两个子线程中获取数据,然后计算结果。

C++程序调用libcurl开源库实现发送邮件的功能