2015-05-07 7 views
1

После того, как я не смог узнать, что происходит в моем приложении, в previous question, я попытался воспроизвести его на своем компьютере с помощью valgrind, чтобы найти проблемы с памятью/многопоточными. Я видел во многих местах:Действительно ли libCurl потокобезопасен?

==769== Possible data race during write of size 4 at 0xACD3ADC by thread #13 
==769== Locks held: none 
==769== at 0x4C36067: memset (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) 
==769== by 0x4E4570D: [email protected]@GLIBC_2.2.5 (allocatestack.c:249) 
==769== by 0x4C30C90: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) 
==769== by 0x509F957: Curl_thread_create (in /usr/lib/x86_64-linux-gnu/libcurl.so.4.3.0) 
==769== by 0x50A261B: Curl_resolver_getaddrinfo (in /usr/lib/x86_64-linux-gnu/libcurl.so.4.3.0) 
==769== by 0x5066163: Curl_resolv (in /usr/lib/x86_64-linux-gnu/libcurl.so.4.3.0) 
==769== by 0x507D74D: Curl_connect (in /usr/lib/x86_64-linux-gnu/libcurl.so.4.3.0) 
==769== by 0x508D62F: multi_runsingle (in /usr/lib/x86_64-linux-gnu/libcurl.so.4.3.0) 
==769== by 0x508E180: curl_multi_perform (in /usr/lib/x86_64-linux-gnu/libcurl.so.4.3.0) 
==769== by 0x50857B2: curl_easy_perform (in /usr/lib/x86_64-linux-gnu/libcurl.so.4.3.0) 
==769== by 0x489D63: ConnectionMgr::checkInternetConnection() (ConnectionMgr.cpp:287) 
==769== by 0x490E9E: void std::_Mem_fn<void (ConnectionMgr::*)()>::operator()<, void>(ConnectionMgr*) const (in /home/user/app) 
==769== 
==769== Address 0xACD3ADC is 44 bytes inside a block of size 304 alloc'd 
==769== at 0x4C2DFF0: calloc (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) 
==769== by 0x4012E54: _dl_allocate_tls (dl-tls.c:296) 
==769== by 0x4E45DA0: [email protected]@GLIBC_2.2.5 (allocatestack.c:589) 
==769== by 0x4C30C90: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) 
==769== by 0x509F957: Curl_thread_create (in /usr/lib/x86_64-linux-gnu/libcurl.so.4.3.0) 
==769== by 0x50A261B: Curl_resolver_getaddrinfo (in /usr/lib/x86_64-linux-gnu/libcurl.so.4.3.0) 
==769== by 0x5066163: Curl_resolv (in /usr/lib/x86_64-linux-gnu/libcurl.so.4.3.0) 
==769== by 0x507D74D: Curl_connect (in /usr/lib/x86_64-linux-gnu/libcurl.so.4.3.0) 
==769== by 0x508D62F: multi_runsingle (in /usr/lib/x86_64-linux-gnu/libcurl.so.4.3.0) 
==769== by 0x508E180: curl_multi_perform (in /usr/lib/x86_64-linux-gnu/libcurl.so.4.3.0) 
==769== by 0x50857B2: curl_easy_perform (in /usr/lib/x86_64-linux-gnu/libcurl.so.4.3.0) 
==769== by 0x489D63: ConnectionMgr::checkInternetConnection() (ConnectionMgr.cpp:287) 

Функция, которую я запускаю в отдельной ветке, является этой.

void ConnectionMgr::checkInternetConnection() 
{ 
    CURL* curl = curl_easy_init(); 

    curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 15); 
    curl_easy_setopt(curl, CURLOPT_URL,"http://www.google.com"); 
    curl_easy_setopt (curl, CURLOPT_FAILONERROR, 1L); 
    curl_easy_setopt (curl, CURLOPT_CONNECT_ONLY, 1L); 

    long responseCode = 404; 
    curl_easy_perform(curl); 
    curl_easy_getinfo (curl, CURLINFO_HTTP_CONNECTCODE, &responseCode); 

    curl_easy_cleanup(curl); 

    mHasInternet = (responseCode == 200); 
} 

Большое спасибо.

+0

Вы вызываете 'curl_global_init' во время запуска вашей программы? Из документа ['curl_easy_init'] (http://curl.haxx.se/libcurl/c/curl_easy_init.html):« Если вы еще не вызывали 'curl_global_init',' curl_easy_init' делает это автоматически. Это может быть смертельным в многопоточные случаи, так как 'curl_global_init' не является потокобезопасным. –

+0

да. Это первая строка в основной функции, прежде чем какой-либо поток был создан. – Acampoh

ответ

1

Возможно, этот вопрос немного устарел, но я нашел ответ на него. Проблема заключалась в том, что Curl использовал сигналы для уведомления о тайм-аутах по запросам и, похоже, не работает нормально с многопоточными.

Чтобы исправить это, я использовал curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1); и после этого он работал правильно.

3

Да!

libcurl является потокобезопасным под documented restrictions. Сотни приложений используют его каждый день успешно в поточном режиме.

Есть ли ошибки? Конечно, мы много работаем над тем, чтобы зафиксировать все, о которых мы сообщаем в проект.

Смежные вопросы