Как защитить функцию init библиотеки C?

Я написал библиотеку на основе C и, чтобы он работал в многопоточном параллельном режиме, я создаю некоторые глобальные мьютексы в функции init.

Я ожидаю, что функция init будет вызвана в основном streamе до того, как API-интерфейсы библиотеки будут использоваться в многопоточном режиме.

Но, если сама функция init вызывается в многопоточном streamе напрямую, то это проблема. Есть ли способ защитить функцию init от моей библиотеки? Один из способов, о котором я могу думать, – попросить приложение создать мьютекс и защитить параллельные вызовы моей функции init, но могу ли я защитить его от самой моей библиотеки?

Вероятно, вы хотите использовать функции точки входа по умолчанию.

В Windows вы можете использовать DllMain для создания и уничтожения ваших мьютексов.

В Linux и, возможно, в некоторых других Unix-системах вы можете использовать __attribute__((constructor)) и __attribute__((destructor)) для своих функций входа и выхода.

В обоих случаях функции будут вызываться один раз при загрузке и разгрузке

POSIX имеет функцию pthread_once

 int pthread_once(pthread_once_t *once_control, void (*init_routine)(void)); 

На странице руководства Linux у них есть следующий поучительный пример

 static pthread_once_t random_is_initialized = PTHREAD_ONCE_INIT; extern int initialize_random(); int random_function() { (void) pthread_once(&random_is_initialized, initialize_random); ... /* Operations performed after initialization. */ }