В C++11 является ли алгоритм std::random_shuffle потокобезопасным (когда вызывается двумя разными потоками в двух разных контейнерах)?
И особенно эта форма:
template <class RandomIt> void random_shuffle(RandomIt first, RandomIt last);
В C++11 является ли алгоритм std::random_shuffle потокобезопасным (когда вызывается двумя разными потоками в двух разных контейнерах)?
И особенно эта форма:
template <class RandomIt> void random_shuffle(RandomIt first, RandomIt last);
Функция является потокобезопасной, если два одновременных выполнения этой функции не «работают» с одними и теми же данными. «работа» здесь означает, что ни одна из функций не может изменять данные неатомарным, непоследовательным образом. Функция может получить доступ к данным тремя способами:
Поскольку random_shuffle
— бесплатная функция, 2.
не применяется. Однако у функции есть параметры, и она работает с ними в том смысле, что изменяет содержимое базовой последовательности. Но проблем не будет, если одновременные вызовы не будут работать с перекрывающимися последовательностями.
Остаются статические/глобальные данные. Большинство генераторов случайных чисел будут использовать какие-то глобальные данные для своего начального числа. Случайная функция по умолчанию rand
не обязана быть потокобезопасной и, вероятно, не будет явно синхронизировать доступ к своему глобальному начальному состоянию.
Так что в вашем случае нет, это не потокобезопасно (если только не работает генератор случайных чисел).
Вы захотите либо написать синхронизированную версию генератора случайных чисел, либо использовать разные генераторы в одновременных вызовах. Я бы предпочел использовать последнее, чтобы одновременные перетасовки не мешали последовательности случайных чисел друг друга. (Но я ни в коем случае не эксперт в генерации случайных чисел).
rqnd
не требуется быть потокобезопасным. Это не то же самое, что сказать, что это не потокобезопасно. Любая конкретная реализация может сделать ее потокобезопасной, и ее документация должна сообщать вам об этом.
- person Pete Becker; 18.07.2013
rand
:-)
- person Arne Mertz; 19.07.2013
Он поточно-ориентированный, если он использует поточно-ориентированный генератор случайных чисел. Генератор определяется реализацией (и, если он использует std::rand
, он определяется реализацией, является ли это безопасным), поэтому вам необходимо ознакомиться с документацией по используемой вами реализации.
Чтобы быть уверенным, вы должны использовать один из других вариантов, предоставляя либо потокобезопасный генератор, либо отдельный генератор для каждого потока.
std::random_shuffle
, вероятно, вызываетstd::rand()
, которая, вероятно, использует какой-то глобальный ресурс. - person juanchopanza   schedule 18.07.2013