libcurl: curl_global_init - потоко-небезопасен

Подскажите пожалуйста, вот в документации Libcurl сказано, что функция curl_global_init():

Эта функция должна быть вызвана хотя бы один раз в программе

и

This function is not thread safe. You must not call it when any other thread in the program (i.e. a thread sharing the same memory) is running.

Эта функция не является потокобезопасной. Вы не должны вызывать его, когда работает любой другой поток в программе (т. Е. Поток, использующий ту же память).

Вот вроде бы отдельно слова понимаю, а общий смысл, как то не доходит. Что значит - "Вы не должны вызывать его, когда работает любой другой поток в программе" ?

То есть, если я создал хотя бы еще один тред в коде, и в этом треде выполнятся все, что угодно, только не libcurl или вообще я поток сразу усыпил, то curl_global_init - нельзя вызывать ?

И дополнительный не понятный момент:

Если вы еще не вызывали curl_global_init , curl_easy_init сделает это автоматически. Это может привести к летальному исходу в многопоточных случаях, поскольку curl_global_init не является потокобезопасным, и может привести к проблемам с ресурсами из-за отсутствия соответствующей очистки.

Прямо не сказано, но правильно ли я понимаю, что вызов curl_global_init() перед curl_easy_init() - укажет функции curl_easy_init() не вызывать curl_global_init() ?


Ответы (1 шт):

Автор решения: HolyBlackCat

Что значит - "Вы не должны вызывать его, когда работает любой другой поток в программе" ?

Ровно это и значит.

То есть, если я создал хотя бы еще один тред в коде, и в этом треде выполнятся все, что угодно, только не libcurl или вообще я поток сразу усыпил, то curl_global_init - нельзя вызывать ?

Здесь так написано, да. Не важно что за поток, в любом случае нельзя.

Другое дело, что это скорее всего неправда, и они просто перестраховываются. Дальше есть пояснение:

You must not call it when any other thread in the program (i.e. a thread sharing the same memory) is running. This does not just mean no other thread that is using libcurl. Because curl_global_init calls functions of other libraries that are similarly thread unsafe, it could conflict with any other thread that uses these other libraries.

Т.е. они зовут не-потокобезопасные функции некоторых других библиотек, и беспокоятся о том, что ваш поток тоже их вызовет. Можно разведать, что там за библиотеки, и избегать конкретно их в параллельных потоках.

→ Ссылка