【问题标题】:Is reading /dev/urandom thread-safe?阅读 /dev/urandom 是线程安全的吗?
【发布时间】:2010-09-13 02:38:12
【问题描述】:

这是代码:

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

如果不是,我如何使它成为线程安全的?

【问题讨论】:

    标签: c multithreading random posix


    【解决方案1】:

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

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

    【讨论】:

    • 显然它应该是安全的,为了理智起见,但我在 man 4 random 中找不到任何指定它的东西。例如,如果 urandom 已经退回到 PRNG 模式,除了偶然之外,两个同时调用者是否会看到相同的输出?当然不是,但是文档在哪里说不是?
    • “看到相同的输出”是“随机”的特例。 :-)
    • @SteveJessop:文档不需要说接口可以工作。另外,urandom 只有一种模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2011-07-19
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多