读/ dev / urandom是线程安全的吗?

时间:2020-03-06 14:43:20  来源:igfitidea点击:

这是代码:

`

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();
  }

`

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

解决方案

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

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