c - распределение - std:: srand




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

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


Visual Studio поставляется с источником библиотеки времени выполнения. Хотя некоторые из них могут быть довольно болезненными для прохода, rand_s () довольно прост.

Все rand_s () это вызов SystemFunction036 () в ADVAPI32.DLL для получения случайного значения. Все, что в ADVAPI32.DLL должно быть потокобезопасным.

Со своей стороны, rand_s () получает указатель на эту функцию поточно-безопасным способом.


Если вы используете многопоточную версию CRT, все функции являются потокобезопасными, поскольку любая информация, зависящая от потока, сохраняется в TLS . rand_s на самом деле не использует информацию о состоянии в первую очередь, поскольку он просто вызывает API OS, поэтому вопрос о безопасности потоков не возникает для rand_s. rand (), однако зависит от начального значения для генерации случайного числа.


Я не могу думать о какой-либо причине, почему rand_s () или даже rand () не будут потокобезопасными.


Крис сказал: rand() не является потокобезопасным, потому что его внутреннее состояние статично, но rand_s() должно быть потокобезопасным.

Джефф добавил, однако, что с многопоточной версией MSVCRT состояние rand() хранится в потоковом локальном хранилище, так что все в порядке.







random