Является ли потокобезопасным чтение /dev/urandom?
-
02-07-2019 - |
Вопрос
Это и есть код:
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
который запрещает доступ к любым устройствам;и т.д.