Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
libcurl-thread(3)	   Library Functions Manual	     libcurl-thread(3)

NAME
       libcurl-thread -	libcurl	thread safety

Multi-threading	with libcurl
       libcurl	is thread-safe but has no internal thread synchronization. You
       may have	to provide your	own locking should you meet any	of the	thread
       safety exceptions below.

Handles
       You  must never share the same handle in	multiple threads. You can pass
       the handles around among	threads, but you must never use	a single  han-
       dle from	more than one thread at	any given time.

Shared objects
       You  can	share certain data between multiple handles by using the share
       interface but you must provide your own locking and set	curl_share_se-
       topt(3) CURLSHOPT_LOCKFUNC and CURLSHOPT_UNLOCKFUNC.

       Note  that some items are specifically documented as not	thread-safe in
       the share API (the connection pool and HSTS cache for example).

TLS
       All current TLS libraries libcurl supports are thread-safe.

       OpenSSL
	      OpenSSL 1.1.0+ can be safely used	in multi-threaded applications
	      provided that support for	the underlying	OS  threading  API  is
	      built-in.	For older versions of OpenSSL, the user	must set mutex
	      callbacks.

	      libcurl  may  not	be able	to fully clean up after	multi-threaded
	      OpenSSL depending	on how OpenSSL was built and loaded as	a  li-
	      brary.  It  is possible in some rare circumstances a memory leak
	      could  occur  unless  you	 implement  your  own  OpenSSL	thread
	      cleanup.

	      For  example,  on	Windows	if both	libcurl	and OpenSSL are	linked
	      statically to a DLL or application then OpenSSL may leak	memory
	      unless the DLL or	application calls OPENSSL_thread_stop()	before
	      each  thread  terminates.	 If  OpenSSL is	built as a DLL then it
	      does this	cleanup	automatically and there	is no leak. If libcurl
	      is built as a DLL	and OpenSSL is linked statically  to  it  then
	      libcurl  does  this  cleanup  automatically and there is no leak
	      (added in	libcurl	8.8.0).

	      Please review the	OpenSSL	documentation for a full list of  cir-
	      cumstances:
	      https://docs.openssl.org/3.0/man3/OPENSSL_init_crypto/#notes

       mbedTLS
	      mbedTLS  can be used safely in a multi-threaded environment pro-
	      vided that mbedTLS is compiled with MBEDTLS_THREADING_C enabled.

	      https://mbed-tls.readthedocs.io/en/latest/kb/develop-
	      ment/thread-safety-and-multi-threading

Signals
       Signals are used	for timing out name resolves  (during  DNS  lookup)  -
       when  built  without using either the c-ares or threaded	resolver back-
       ends. On	systems	that have a signal concept.

       When using multiple threads you should set the CURLOPT_NOSIGNAL(3)  op-
       tion  to	1L for all handles. Everything works fine except that timeouts
       cannot be honored during	DNS lookups - which you	 can  work  around  by
       building	 libcurl with c-ares or	threaded-resolver support. c-ares is a
       library that provides asynchronous name resolves.  On  some  platforms,
       libcurl	 cannot	 function  properly  multi-threaded  unless  the  CUR-
       LOPT_NOSIGNAL(3)	option is set.

       When CURLOPT_NOSIGNAL(3)	is set to 1L, your application needs  to  deal
       with the	risk of	a SIGPIPE (that	at least the OpenSSL backend can trig-
       ger).  Note  that  setting CURLOPT_NOSIGNAL(3) to 0L does not work in a
       threaded	situation as there is a	race  condition	 where	libcurl	 risks
       restoring  the  former signal handler while another thread should still
       ignore it.

Name resolving
       The gethostbyname or getaddrinfo	and other name resolving system	 calls
       used  by	 libcurl  are  provided	 by  your operating system and must be
       thread-safe. It is important that libcurl can find and use  thread-safe
       versions	 of these and other system calls, as otherwise it cannot func-
       tion fully thread-safe. Some operating systems are known	to have	faulty
       thread implementations. We have previously received problem reports  on
       *BSD  (at least in the past, they may be	working	fine these days). Some
       operating systems that are known	to have	solid and working thread  sup-
       port are	Linux, Solaris and Windows.

curl_global_* functions
       These  functions	 are  thread-safe  since  libcurl  7.84.0 if curl_ver-
       sion_info(3) has	the  CURL_VERSION_THREADSAFE  feature  bit  set	 (most
       platforms).

       If  these  functions are	not thread-safe	and you	are using libcurl with
       multiple	threads	it is especially important that	before	use  you  call
       curl_global_init(3) or curl_global_init_mem(3) to explicitly initialize
       the  library  and  its  dependents,  rather  than  rely	on  the	"lazy"
       fail-safe   initialization   that   takes   place   the	 first	  time
       curl_easy_init(3)  is  called.  For  an	in-depth  explanation refer to
       libcurl(3) section GLOBAL CONSTANTS.

Memory functions
       These functions,	provided either	by your	operating system or  your  own
       replacements,  must be thread-safe. You can use curl_global_init_mem(3)
       to set your own replacement memory functions.

Non-safe functions
       CURLOPT_DNS_USE_GLOBAL_CACHE(3) is not thread-safe.

       curl_version_info(3) is not thread-safe before libcurl initialization.

SEE ALSO
       libcurl-security(3)

libcurl				  2026-06-11		     libcurl-thread(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=libcurl-thread&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help