2008-09-25 66 views
8

这是代码:正在读/ dev/urandom线程安全吗?

 
    unsigned int number; 
    FILE* urandom = fopen("/dev/urandom", "r"); 
    if (urandom) { 
    size_t bytes_read = fread(&number, 1, sizeof(number), urandom); 
    DCHECK(bytes_read == sizeof(number)); 
    fclose(urandom); 
    } else { 
    NOTREACHED(); 
    } 

如果没有,我如何使它线程安全的?

回答

10

只要函数的每一次执行是在自己的线程(即局部变量numberurandombytes_read不是线程之间共享),我没有看到任何线程安全问题。然后每个线程将拥有自己的文件描述符到/dev/urandom/dev/urandom可以同时从多个进程打开,所以没关系。

顺便说一句,/dev/urandom可能无法打开,您的代码应该处理它。一些原因是:缺少可用的文件描述符; /dev没有正确安装(尽管在这种情况下你有更大的问题);你的程序正在运行在一个特殊的chroot,它拒绝访问任何设备;等等。

+0

显然它应该是安全的,为了理智的缘故,但我无法找到任何指定它的随机4中的任何东西。例如,如果urandom已经回到PRNG模式,两个同时的呼叫者能否看到相同的输出,而不是偶然?当然不是,但是文档不说什么? – 2008-09-25 14:20:13