下面的情况会发生什么?
#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");
}
它会导致无限递归吗?谢谢!
[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
答案 0 :(得分:1)
在正确的pthread实现init_routine()
上只会调用一次,因此不会有无限递归。但是,pthread_once()
的所有其他呼叫者必须等到init_routine()
执行完毕。在这种情况下,它永远不会完成,所以你已经创建了一个死锁。