Когда pthread_once сталкивается с повторной установкой

Что произойдет в ситуации ниже?

#include <pthread.h>
#include <stdio.h>

static pthread_once_t random_is_initialized = PTHREAD_ONCE_INIT;
void initialize(){
 foo("init()");
}


int foo(char *str)
{
 pthread_once(&random_is_initialized, initialize);
 printf("%s", str);
}

int main(){
 foo("main");
}
</stdio.h></pthread.h>

Будет ли это причиной бесконечной рекурсии? Благодарю!

[edit] Я запустил код. Кажется, что код не вызывает бесконечную рекурсию, но он блокирует второй pthread_once, что мне нужно "ctrl + c". То есть, произошел тупик.

(gdb) bt
#0 0x0012d422 in __kernel_vsyscall ()
#1 0x00139404 in pthread_once () from /lib/tls/i686/cmov/libpthread.so.0
#2 0x080484a3 in foo (str=0x8048590 "init()") at main.c:12
#3 0x08048486 in initialize () at main.c:6
#4 0x00139430 in pthread_once () from /lib/tls/i686/cmov/libpthread.so.0
#5 0x080484a3 in foo (str=0x804859a "main") at main.c:12
#6 0x080484ce in main () at main.c:17
1 ответ

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

licensed under cc by-sa 3.0 with attribution.