В качестве примера использования pthread_once() обычно приводится код наподобие следующего:
static pthread_once_t once = PTHREAD_ONCE_INIT;
void do()
{
pthread_once(&once, &init);
// do something
...
}
Но попался мне тут на днях в исходниках одного проекта немного другой пример использования:
void do()
{
static pthread_once_t once = PTHREAD_ONCE_INIT;
pthread_once(&once, &init);
// do something
...
}
И закрались у меня подозрения что второй вариант не всегда гарантирует вызова init() только один раз в многопоточной программе т.к. в нем не исключены гонки при инициализации once. Развейте или подтвердите мои сомнения.