Является ли Windows rand_s поточно-ориентированным? - PullRequest
13 голосов
/ 27 сентября 2008

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

Ответы [ 5 ]

11 голосов
/ 27 сентября 2008

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

3 голосов
/ 27 сентября 2008

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

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

2 голосов
/ 27 сентября 2008

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

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

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

0 голосов
/ 27 сентября 2008

Я не знаю, является ли rand_s поточно-ориентированным, но кажется, что это, вероятно, так, поскольку кажется, что он совершает обратную поездку в ОС для энтропии. (пока вы ссылаетесь на многопоточный CRT VC ++, все ставки отключены, если вы ссылаетесь на однопоточный)

Если это поддерживается Windows CRT, вы можете попробовать вызвать rand_r, который является вердиктовой версией posix. ИЛИ еще лучше boost :: random, если вы уже используете boost.

учитывая, насколько скоро будет распространена многопоточность, никто не должен больше использовать rand () в новом коде - всегда пытайтесь использовать rand_r / rand_s / boost / для различных безопасных рандов, зависящих от платформы / и т.д.

0 голосов
/ 27 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...