当pthread_once遇到重入时

时间:2014-01-17 02:06:41

标签: multithreading pthreads

下面的情况会发生什么?

#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

1 个答案:

答案 0 :(得分:1)

在正确的pthread实现init_routine()上只会调用一次,因此不会有无限递归。但是,pthread_once()的所有其他呼叫者必须等到init_routine()执行完毕。在这种情况下,它永远不会完成,所以你已经创建了一个死锁。