2015-02-24 104 views
1

我對使用libcurl(C++)執行並行HTTP請求的安全性有疑問。在閱讀這個問題時,請記住我一般對HTTP請求的知識有限。並行libcurl HTTP請求

基本上,假設我有兩個(或更多)線程,每個線程每秒發出一次HTTP請求。 (所有請求都發送到同一臺服務器)。我的程序(或別的什麼?)如何跟蹤HTTP響應屬於哪個階段?我的意思是,我可以確定,如果請求A是從線程1發出的,並且同時請求線程2中的B,並且同時回覆響應,則正確的響應(響應A)會轉到線程1,並且響應B到線程2?

請原諒我對此事的無知。

謝謝。

回答

4

所有的libcurl首先是thread safe

libcurl的設計和實現完全線程安全的

正如所有你需要做的這個官方文件指出的是:

從不在多個線程之間共享libcurl句柄。您應該在任何給定的時間在一個單獨的線程中只使用一個句柄。

另外也有這個official FAQ entry,如果你打算使用SSL提供一些更多的精度,例如:如果您在多線程環境中使用OpenSSL的供電libcurl的

,你需要以提供一個或兩個鎖定功能

正如你可以看到有其示出了多線程使用容易手柄的正式例如:見multithread.c

/* This is the callback executed when a new threads starts */ 
static void *pull_one_url(void *url) 
{ 
    CURL *curl; 

    curl = curl_easy_init(); 
    curl_easy_setopt(curl, CURLOPT_URL, url); 
    curl_easy_perform(curl); /* ignores error */ 
    curl_easy_cleanup(curl); 

    return NULL; 
} 

/* ... */ 

/* This is the main loop that creates `NUMT` threads for parallel fetching */ 
for(i=0; i< NUMT; i++) { 
    error = pthread_create(&tid[i], 
          NULL, /* default attributes please */ 
          pull_one_url, 
          (void *)urls[i]); 
    /* ... */ 
} 

因此,請隨時舉出這個例子。

最後請記住,libcurl還提供所謂的multi interface,其中提供使用單個線程的多個傳輸。根據您的使用情況,您可能會發現它也很方便。

編輯

關於OpenSSL的+多線程有具體負責人的例子,可以幫助:

+0

非常好的答案,謝謝。我在理解這一點時遇到了一些問題:http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION我沒有任何openssl.h頭文件,我下載了一個預編譯的二進制文件v0。對於Win64位爲9.8r。你有這樣的例子嗎?再次感謝。 – jensa 2015-02-24 14:40:18

+0

我會說這是值得一個(新)專用問題。 – deltheil 2015-02-24 18:38:30

+0

請參閱下面的答案。 – jensa 2015-02-24 18:48:04

0

我試過如下:

static std::mutex* aMutex; 


void locking_function(int mode, int n, const char* file, int line) 
{ 
    if(mode & CRYPTO_LOCK){ 
     std::cout << "Mutex locking\n"; 
     aMutex[n].lock(); 
    } 
    else{ 
     std::cout << "Mutex unlocking\n"; 
     aMutex[n].unlock(); 
    } 
} 

unsigned long id_function() 
{ 
    return (unsigned long)std::hash<std::thread::id>() (std::this_thread::get_id()); 
} 

int thread_setup() 
{ 
    aMutex = new std::mutex[CRYPTO_num_locks()]; 
    if(!aMutex) 
     return 0; 
    else{ 
     CRYPTO_set_id_callback(id_function); 
     CRYPTO_set_locking_callback(locking_function); 
    } 
    return 1; 
} 

int thread_cleanup() 
{ 
    if(!aMutex) 
     return 0; 

    CRYPTO_set_id_callback(NULL); 
    CRYPTO_set_locking_callback(NULL); 
    delete[] aMutex; 
    aMutex = NULL; 
    return 1; 
} 

基於我在這裏找到:OpenSSL and multi-threads

當我創建的捲曲手柄

curl_ = curl_easy_init(); 

句子「互斥鎖」和「互斥解鎖」被打印一遍又一遍的真快。當我銷燬CURL手柄時,它會停止?這是正常的還是正確的?

謝謝。

+1

問後續問題,因爲你自己的問題的答案只是錯誤的... – 2015-03-02 07:35:52

+0

對不起,我將把它移到一個新的問題。 – jensa 2015-03-03 09:17:50