Как защитить функцию инициализации библиотеки на основе C? - PullRequest
2 голосов
/ 24 августа 2010

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

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

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

Ответы [ 2 ]

5 голосов
/ 24 августа 2010

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

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

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

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

2 голосов
/ 24 августа 2010

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. */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...