青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

colorful

zc qq:1337220912

 

libcurl 多線程使用注意事項(補充)——HTTPS,openssl多線程使用加鎖

問題

多線程libcurl運行一段時間后出現崩掉,沒有確定的點,沒有確定的URL。一直查看源代碼沒有問題,最后通過debug跟蹤發現是在訪問SSL的時候出現的crash。

才想起來openssl是不支持多線程的,要自己做加鎖處理。而且libcurl中并沒有支持相關的加鎖操作。


解決辦法:

在初始化libcurl的時候為openssl創建一個互斥鎖函數,一個回調函數傳給openss

openssl鎖l函數原形 :void (* func )(int ,int , const char * ,int)

設置方式:CRYPTO_set_locking_callback(void (* func )(int ,int , const char * ,int));

設置這樣一個函數還不夠,另外還要配置一個鎖id回調函數,這個可以參考openssl多線程下的使用相關。

id函數原形:unsigned int (*func)(void)

設置方式:CRYPTO_set_id_callback(unsigned int (*func)(void));

通過這兩個設置就可以解決HTTPS多線程請求出現crash的問題。


代碼示例:

下面是引用了libcurl示例的一個代碼

http://curl.haxx.se/libcurl/c/opensslthreadlock.html

最關鍵就是,兩個callback的實現,還有初始化鎖(init_locks)和釋放鎖(kill_locks)的位置

  1. #define USE_OPENSSL    
  2.    
  3. #include <stdio.h>  
  4. #include <pthread.h>  
  5. #include <curl/curl.h>  
  6.    
  7. #define NUMT 4  
  8.    
  9. /* we have this global to let the callback get easy access to it */   
  10. static pthread_mutex_t *lockarray;  
  11.    
  12. #ifdef USE_OPENSSL  
  13. #include <openssl/crypto.h>  
  14. static void lock_callback(int mode, int type, char *file, int line)  
  15. {  
  16.   (void)file;  
  17.   (void)line;  
  18.   if (mode & CRYPTO_LOCK) {  
  19.     pthread_mutex_lock(&(lockarray[type]));  
  20.   }  
  21.   else {  
  22.     pthread_mutex_unlock(&(lockarray[type]));  
  23.   }  
  24. }  
  25.    
  26. static unsigned long thread_id(void)  
  27. {  
  28.   unsigned long ret;  
  29.    
  30.   ret=(unsigned long)pthread_self();  
  31.   return(ret);  
  32. }  
  33.    
  34. static void init_locks(void)  
  35. {  
  36.   int i;  
  37.    
  38.   lockarray=(pthread_mutex_t *)OPENSSL_malloc(CRYPTO_num_locks() *  
  39.                                             sizeof(pthread_mutex_t));  
  40.   for (i=0; i<CRYPTO_num_locks(); i++) {  
  41.     pthread_mutex_init(&(lockarray[i]),NULL);  
  42.   }  
  43.    
  44.   CRYPTO_set_id_callback((unsigned long (*)())thread_id);  
  45.   CRYPTO_set_locking_callback((void (*)())lock_callback);  
  46. }  
  47.    
  48. static void kill_locks(void)  
  49. {  
  50.   int i;  
  51.    
  52.   CRYPTO_set_locking_callback(NULL);  
  53.   for (i=0; i<CRYPTO_num_locks(); i++)  
  54.     pthread_mutex_destroy(&(lockarray[i]));  
  55.    
  56.   OPENSSL_free(lockarray);  
  57. }  
  58. #endif  
  59.    
  60. #ifdef USE_GNUTLS  
  61. #include <gcrypt.h>  
  62. #include <errno.h>  
  63.    
  64. GCRY_THREAD_OPTION_PTHREAD_IMPL;  
  65.    
  66. void init_locks(void)  
  67. {  
  68.   gcry_control(GCRYCTL_SET_THREAD_CBS);  
  69. }  
  70.    
  71. #define kill_locks()  
  72. #endif  
  73.    
  74. /* List of URLs to fetch.*/   
  75. const char * const urls[]= {  
  76.   "https://www.example.com/",  
  77.   "https://www2.example.com/",  
  78.   "https://www3.example.com/",  
  79.   "https://www4.example.com/",  
  80. };  
  81.    
  82. static void *pull_one_url(void *url)  
  83. {  
  84.   CURL *curl;  
  85.    
  86.   curl = curl_easy_init();  
  87.   curl_easy_setopt(curl, CURLOPT_URL, url);  
  88.   /* this example doesn't verify the server's certificate, which means we 
  89.      might be downloading stuff from an impostor */   
  90.   curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);  
  91.   curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);  
  92.   curl_easy_perform(curl); /* ignores error */   
  93.   curl_easy_cleanup(curl);  
  94.    
  95.   return NULL;  
  96. }  
  97.    
  98. int main(int argc, char **argv)  
  99. {  
  100.   pthread_t tid[NUMT];  
  101.   int i;  
  102.   int error;  
  103.   (void)argc; /* we don't use any arguments in this example */   
  104.   (void)argv;  
  105.    
  106.   /* Must initialize libcurl before any threads are started */   
  107.   curl_global_init(CURL_GLOBAL_ALL);  
  108.    
  109.   init_locks();  
  110.    
  111.   for(i=0; i< NUMT; i++) {  
  112.     error = pthread_create(&tid[i],  
  113.                            NULL, /* default attributes please */   
  114.                            pull_one_url,  
  115.                            (void *)urls[i]);  
  116.     if(0 != error)  
  117.       fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);  
  118.     else  
  119.       fprintf(stderr, "Thread %d, gets %s\n", i, urls[i]);  
  120.   }  
  121.    
  122.   /* now wait for all threads to terminate */   
  123.   for(i=0; i< NUMT; i++) {  
  124.     error = pthread_join(tid[i], NULL);  
  125.     fprintf(stderr, "Thread %d terminated\n", i);  
  126.   }  
  127.    
  128.   kill_locks();  
  129.    
  130.   return 0;  

posted on 2013-12-02 17:13 多彩人生 閱讀(2728) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

統計

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日本不卡| 久久精品道一区二区三区| 亚洲国产精品久久久久秋霞蜜臀 | 免费看黄裸体一级大秀欧美| 久久久亚洲精品一区二区三区| 裸体一区二区| 一本色道久久精品| 欧美中文字幕在线| 欧美日韩第一区| 国产欧美日韩麻豆91| 亚洲国产经典视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 好吊色欧美一区二区三区视频| 在线免费不卡视频| 亚洲免费在线看| 美日韩精品免费| 蜜桃av噜噜一区二区三区| 欧美日韩一二区| 亚洲福利视频二区| 亚洲精品日韩在线观看| 久久成年人视频| 欧美视频中文一区二区三区在线观看| 狠狠色丁香久久婷婷综合_中| 免费亚洲一区二区| 欧美日韩免费高清| 欧美在线一级va免费观看| 亚洲精品国偷自产在线99热| 篠田优中文在线播放第一区| 欧美另类高清视频在线| 午夜久久久久久| 亚洲乱码视频| 国产亚洲精品自拍| 欧美一区二区精美| 亚洲午夜精品网| 欧美日韩黄色大片| 久久久www成人免费无遮挡大片| 亚洲一区二区影院| 国产精品99免费看| 中文亚洲免费| 亚洲欧洲日产国码二区| 欧美二区在线| 国产精品日韩在线观看| 宅男精品导航| 一区二区高清视频在线观看| 国产综合久久久久久| 久久精品人人| 欧美日韩国产综合视频在线观看| 久久久91精品国产一区二区三区| 欧美日韩精品免费观看视一区二区 | 久久成人一区二区| 欧美日韩高清在线| 欧美不卡三区| 久久久久久久久久久久久女国产乱 | 免费黄网站欧美| 亚洲国产精品成人综合| 亚洲欧美日韩精品| 国产综合视频在线观看| 日韩一级欧洲| 国产欧美一区二区三区视频| 亚洲日韩欧美视频| 亚洲日本在线视频观看| 亚洲国产精品激情在线观看| 黑人巨大精品欧美一区二区 | 欧美激情片在线观看| 欧美成人影音| 欧美成人性网| 欧美色欧美亚洲高清在线视频| 亚洲国产国产亚洲一二三| 欧美色大人视频| 亚洲精选视频免费看| 艳妇臀荡乳欲伦亚洲一区| 亚洲天堂av电影| 午夜欧美不卡精品aaaaa| 欧美吻胸吃奶大尺度电影| 亚洲精品欧美一区二区三区| 亚洲精品一区二区三区四区高清 | 99热精品在线观看| 国产一区二区中文字幕免费看| 亚洲综合不卡| 亚洲日韩第九十九页| 欧美第一黄网免费网站| 亚洲精品乱码久久久久久蜜桃91 | 国产精品性做久久久久久| 一本一道久久综合狠狠老精东影业| 在线亚洲电影| 国产精品久久二区二区| 欧美成人午夜| 亚洲三级免费| 欧美系列一区| 欧美永久精品| 亚洲福利av| 亚洲在线播放电影| 欧美成人免费在线视频| 亚洲黑丝一区二区| 亚洲欧美一区二区激情| 国产一区二区三区久久久| 久久在线视频在线| 久久精品99国产精品日本| 一区二区三区在线视频观看| 亚洲在线视频网站| 免费的成人av| 亚洲制服少妇| 激情久久婷婷| 欧美日韩一区二区三| 久久国产精品一区二区三区四区| 欧美国产乱视频| 亚洲欧美日韩区| 在线欧美日韩国产| 国产精品二区在线| 玖玖视频精品| 亚洲自拍电影| 亚洲精品一区二区网址 | 伊人久久综合| 久久国产精品亚洲77777| 亚洲国产视频直播| 久久精品国产久精国产爱| 99精品99久久久久久宅男| 久久综合图片| 亚洲在线一区二区| 亚洲精品在线免费| 老司机67194精品线观看| 亚洲欧洲av一区二区三区久久| 亚洲国产综合在线看不卡| 久久麻豆一区二区| 久久久午夜电影| 亚洲一区精品电影| 亚洲日本免费| 亚洲大片在线| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品久久午夜| 亚洲尤物视频在线| 亚洲精品欧美日韩| 欧美华人在线视频| 免费毛片一区二区三区久久久| 欧美一级播放| 一色屋精品视频在线看| 国产日韩欧美中文| 久久久噜久噜久久综合| 欧美亚洲在线视频| 欧美成人有码| 快射av在线播放一区| 久久精品视频网| 久久精品国产精品亚洲综合| 欧美亚洲免费在线| 欧美一区视频| 欧美一区二区三区另类| 午夜亚洲影视| 欧美在线观看日本一区| 性欧美1819sex性高清| 欧美一区二区三区久久精品| 香蕉久久夜色精品国产| 香蕉久久一区二区不卡无毒影院| 亚洲综合色噜噜狠狠| 性欧美大战久久久久久久久| 欧美一级二级三级蜜桃| 欧美中文在线免费| 久久婷婷国产麻豆91天堂| 99在线|亚洲一区二区| 日韩亚洲在线| 亚洲一区二区综合| 久久不见久久见免费视频1| 久久精品国产精品亚洲综合| 久久伊人亚洲| 亚洲成人资源网| 久久夜色精品国产亚洲aⅴ| 久久久视频精品| 欧美国产精品劲爆| 亚洲精品乱码久久久久久黑人| 在线视频欧美日韩精品| 亚洲国产91| 中日韩美女免费视频网站在线观看| 亚洲一区精品电影| 久久精品国产清自在天天线| 欧美a级大片| 欧美午夜视频在线观看| 国产日产欧产精品推荐色 | 精品成人一区| 亚洲巨乳在线| 亚洲国产精品成人综合| 一本色道**综合亚洲精品蜜桃冫| 先锋影院在线亚洲| 蜜臀99久久精品久久久久久软件| 亚洲激情成人网| 午夜国产不卡在线观看视频| 麻豆精品在线播放| 国产精品乱码一区二三区小蝌蚪| 激情一区二区| 亚洲一区二区三区久久| 一本色道久久88综合日韩精品| 欧美亚洲一区二区在线| 欧美国产精品v| 午夜视频在线观看一区| 欧美精品三级| 欧美日韩mp4| 狠狠干综合网| 午夜影院日韩| 最新亚洲电影| 久久精品国产在热久久| 久久夜色精品国产欧美乱极品| 欧美日韩在线第一页|