* Mark Wielaard: > Hi, > > On Thu, Mar 31, 2022 at 04:00:16PM +0300, Catalin Raceanu via curl-library > wrote: >> On 31-Mar-22 15:04, Mark Wielaard wrote: >> > whether there is a thread-safe way to call >> > curl_global_init at a later time (to get rid of the library constructor >> > init function). >> >> I believe that this is an exact fit for C==11's std::call_once(). Boost also >> has an equivalent, that most likely predates the other, in case older c++ >> standard is used. > > Thanks. Our library is pure C, but we can probably rely on > pthread_once if it is allowable to call curl_global_init at a later > time when multiple threads are already running.
The problem is that every caller of pthread_once needs to use the same pthread_once_t synchronization object, so you still have the same problem. I strongly believe that library-safe code needs to perform lazy initialization, that is, initialize the library on first use, and do that in a thread-safe manner. It solves the synchronization issue between different users of the API, and it's the only way to report errors properly (for example, a failure in an ELF constructor can only be reported via process termination). At least on Linux, the need to support multiple different threading libraries is a thing of the past. Thanks, Florian