2013-03-14 8 views
3

Я работал над двумя потоками, пытаясь генерировать случайные числа, посеянные после семян (время (null)) в main(). Программа получила ошибку сегментации непрерывно, пока не выяснила, что при работе с потоками мы должны генерировать случайные числа для всех потоков в их собственных подпрограммах, и тогда не было никакой ошибки seg.rand() с несколькими потоками

Я попытался найти ответ на вопрос о том, почему мы должны семена самостоятельно для всех потоков, но не нашли достаточных убедительных ответов. Может ли кто-нибудь объяснить это? Спасибо!

+3

http://stackoverflow.com/questions/6161322/using-rand-with-multiple-threads-in-c должен ответить на ваш вопрос – Dariusz

+0

Пожалуйста, покажите нам свой код segfaulting (чем короче, тем лучше). – NPE

ответ

5

Чтобы дать вам короткий и прямой ответ:

rand() не Потокобезопасный.

Он не должен вызываться из нескольких потоков без явного критического раздела.

0

Если это не для криптографии, а для ситуаций Монте-Карло или что-то в этом ключе, Mersenne Twister - хорошее решение. В частности, эта версия http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/DC/dc.html Устанавливается специально для параллельного или резьбового использования. Работа была выполнена оригинальными авторами, и PRNG имеет очень длительный период.

3

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

Однако вы можете использовать nrand48 (http://linux.about.com/library/cmd/blcmdl3_nrand48.htm), который принимает в качестве аргумента хранилище, используемое для семени.

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

Смежные вопросы