Подтвердить что ты не робот

Является ли Windows rand_s потокобезопасной?

Как и в заголовке. Подозреваю, что это так, но я не мог найти его в явном виде. И для этого свойства я бы не хотел полагаться на спекуляции.

4b9b3361

Ответ 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() не будут потокобезопасными.