Как и в заголовке. Подозреваю, что это так, но я не мог найти его в явном виде. И для этого свойства я бы не хотел полагаться на спекуляции.
Является ли Windows rand_s потокобезопасной?
Ответ 1
Если вы используете многопоточную версию CRT, все функции являются потокобезопасными, поскольку любая информация, зависящая от потока, хранится в TLS. rand_s на самом деле не использует информацию о состоянии в первую очередь, поскольку он просто вызывает API OS, поэтому вопрос о безопасности потоков не возникает для rand_s. rand(), однако зависит от начального значения для генерации случайного числа.
Ответ 2
Chris сказал: rand()
не является потокобезопасным, потому что его внутреннее состояние статично, но rand_s()
должно быть поточно-безопасным.
Однако Джефф добавил, что с многопоточной версией MSVCRT состояние rand()
сохраняется в локальном хранилище потоков, поэтому все в порядке.
Ответ 3
Visual Studio поставляется с источником библиотеки времени исполнения. Хотя некоторые из них могут быть довольно болезненными для прохода, rand_s() довольно прост.
Все rand_s() это вызов SystemFunction036() в ADVAPI32.DLL для получения случайного значения. Все, что в ADVAPI32.DLL должно быть потокобезопасным.
Со своей стороны, rand_s() получает указатель на эту функцию поточно-безопасным способом.
Ответ 4
Я не знаю, является ли rand_s потокобезопасным, но похоже, что это, вероятно, так, потому что, похоже, для энтропии он обращается к ОС. (пока вы ссылаетесь на многопоточный CRT VС++, все ставки отключены, если вы ссылаетесь на однопоточный)
Если он поддерживается Windows CRT, вы можете попробовать позвонить rand_r, который является исходной версией rand. ИЛИ еще лучше boost:: random, если вы уже используете boost.
учитывая, насколько скоро будет распространяться многопоточность, никто не должен использовать rand() больше в новом коде - всегда пытайтесь использовать rand_r/rand_s/boost/различные зависимые от платформы защищенные rands/etc.
Ответ 5
Я не могу думать о какой-либо причине, почему rand_s() или даже rand() не будут потокобезопасными.