Это код:
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, который запрещает доступ к любым устройствам; и т.п.
«Видеть один и тот же результат» - это частный случай «случайного». :-)
@SteveJessop: В документации не обязательно сказано, что интерфейс работает. Кроме того, urandom имеет только один режим.
Ясно, что это должно быть безопасно, ради здравого смысла, но я не могу найти в man 4 random ничего, что указывало бы на это. Например, если urandom вернулся в режим PRNG, могут ли два одновременно вызывающих абонента увидеть один и тот же результат, кроме как случайно? Конечно, нет, но где в документации сказано, что нет?