日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

libcurl 多线程使用注意事项 - Balder~专栏 - 博客频道 - CSDN.NET

發布時間:2025/3/17 asp.net 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 libcurl 多线程使用注意事项 - Balder~专栏 - 博客频道 - CSDN.NET 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

libcurl 多線程使用注意事項 - Balder~專欄 - 博客頻道 - CSDN.NET

libcurl 多線程使用注意事項

分類: C/C++學習 2843人閱讀 評論(1) 收藏 舉報多線程asynchronous文檔behaviortcp任務(1), 超時(timeout)
libcurl 是 一個很不錯的庫,支持http,ftp等很多的協議。使用庫最大的心得就是,不仔細看文檔,僅僅看著例子就寫程序,是一件危險的事情。我的程序崩潰了,我 懷疑是自己代碼寫的問題,后來發現是庫沒用對。不仔細看文檔(有時候文檔本身也比較差勁,這時除了看仔細外,還要多動腦子,考慮它是怎么實現的),后果很 嚴重。不加思索的使用別人的庫或者代碼,有時候很愜意,但是出問題時,卻是寢食難安的。?

1. CURLcode curl_global_init(long flags); 在多線程應用中,需要在主線程中調用這個函數。這個函數設置libcurl所需的環境。通常情況,如果不顯式的調用它,第一次調用 curl_easy_init()時,curl_easy_init 會調用 curl_global_init,在單線程環境下,這不是問題。但是多線程下就不行了,因為curl_global_init不是線程安全的。在多個線 程中調用curl_easy_int,然后如果兩個線程同時發現curl_global_init還沒有被調用,同時調用 curl_global_init,悲劇就發生了。這種情況發生的概率很小,但可能性是存在的。

2. libcurl 有個很好的特性,它甚至可以控制域名解析的超時。但是在默認情況下,它是使用alarm + siglongjmp 實現的。用alarm在多線程下做超時,本身就幾乎不可能。如果只是使用alarm,并不會導致程序崩潰,但是,再加上siglongjmp,就要命了 (程序崩潰的很可怕,core中幾乎看不出有用信息),因為其需要一個sigjmp_buf型的全局變量,多線程修改它。(通常情況下,可以每個線程一個 sigjmp_buf 型的變量,這種情況下,多線程中使用 siglongjmp 是沒有問題的,但是libcurl只有一個全局變量,所有的線程都會用)。

具體是類似 curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30L) 的超時設置,導致alarm的使用(估計發生在域名解析階段),如前所述,這在多線程中是不行的。解決方式是禁用掉alarm這種超時, curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L)。

這樣,多線程中使用超時就安全了。但是域名解析就沒了超時機制,碰到很慢的域名解析,也很麻煩。文檔的建議是 Consider building libcurl with c-ares support to enable asynchronous DNS lookups, which enables nice timeouts for name resolves without signals. c-ares 是異步的 DNS 解決方案。

引自:http://gcoder.blogbus.com/logs/54871550.html

調用libcurl下載,然后使用netstat查看發現有大量的TCP連接保持在CLOSE_WAIT狀態
查看libcurl的文檔說明,有這樣一個選項:

CURLOPT_FORBID_REUSE

Pass a long. Set to 1 to make the next transfer explicitly close the connection when done. Normally, libcurl keeps all connections alive when done with one transfer in case a succeeding one follows that can re-use them. This option should be used with caution and only if you understand what it does. Set to 0 to have libcurl keep the connection open for possible later re-use (default behavior).?

也就是說,默認情況下libcurl完成一個任務以后,出于重用連接的考慮不會馬上關閉
如果沒有新的TCP請求來重用這個連接,那么只能等到CLOSE_WAIT超時,這個時間默認在7200秒甚至更高,太多的CLOSE_WAIT連接會導致性能問題

解決方法:


curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1);?

最好再修改一下TCP參數調低CLOSE_WAIT和TIME_WAIT的超時時間

總結

以上是生活随笔為你收集整理的libcurl 多线程使用注意事项 - Balder~专栏 - 博客频道 - CSDN.NET的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。