2016-05-12 33 views
-1

由於libcurl的是線程安全的,因爲從它的官方documentation說:替代工作方法錯了,它使用捲曲把手在多線程

的libcurl是線程安全的,但...

其中還說:

把手。您絕不能在多個線程中共享相同的句柄。您可以在線程之間傳遞句柄,但是在任何給定時間,您絕不能使用來自多個線程的單個句柄。

所以在多個線程上創建單個句柄並使它們(句柄)同步將無法工作。

我該如何獲得這樣一種替代的,高效的和便宜的HTTP請求方式(通常也是這樣POST和GET請求)呢?

+0

_「,因此在多個線程上創建單個句柄並使它們(句柄)同步將無法工作。」_你如何解釋這個?我讀過它,同步使用句柄與互斥或類似應該工作正常。 –

+0

我不知道你指的是哪個來源。通常'std :: mutex'和OpenSSL連接並不直接相關。 –

回答

2

至少對我而言,這聽起來像是你錯誤地解釋了文件。

您可以在每個需要發出請求的線程中創建一個單獨的句柄,並且該線程可以通過該句柄(安全地)發出請求。

您可以創建一個句柄,並在多個線程之間共享它,但是您需要同步訪問,因此只有其中一個線程在任何給定時間發出請求。實現這一點的顯而易見的方法是通過一個互斥體來保護句柄,這個互斥體在呼叫之前需要被獲取,並且一直保持到呼叫完成。

爲了簡單起見,您可能希望在每個將要進行卷曲調用的線程中創建一個單獨的句柄。至少在我閱讀文檔時,只要每個線程使用一個不能/不會被另一個線程同時使用的獨立句柄,那麼你就很安全。

+0

只要每個線程使用一個單獨的句柄,** ** ** **將**被另一個線程併發使用,它應該不會被使用嗎? – cpp2alker

+0

@ cpp2alker:可以嗎?不 - 總的來說,每個線程都會創建自己的句柄。沒有其他線程使用該句柄。然後該線程可以進行調用,而不需要同步(等)。如果句柄被另一個線程共享,那麼你需要同步對句柄的訪問,這會增加難度。 –

+0

謝謝你的好解釋。你能舉一個例子 - 建議使用std :: mutex來同步對handle_的訪問嗎?是的,我將使用從多個線程共享的句柄。 – cpp2alker