1 | ||||||
Многопоточность и random_device09.05.2022, 16:14. Показов 1122. Ответов 10
Метки нет (Все метки)
или нужно их объявлять static thread_local?
0
|
09.05.2022, 16:14 | |
Ответы с готовыми решениями:
10
std::random_device STL random_device std::random_device падает приложение Многопоточность |
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,790
|
|
09.05.2022, 16:27 | 2 |
если в функции
test вызывается функция create_obj_and_start , то все ок, т.к. работа с локальными для потока объектами.
1
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,058
|
|
09.05.2022, 17:47 | 4 |
Странно поставленный вопрос. Что тут изменит
thread_local ?Тут у каждого потока и так свой собственный random_device и свой собственный mt19937 , то есть для этих объектов не будет никакого "многопоточного режима". С каждым таким объектом работает только один поток.Другое дело: а нет ли у random_device некоего глобального внутреннего состояния/ресурса, которое разделяется между разными объектами random_device и к которому, соответственно, будет осуществляться конкурентный доступ из нескольких потоков, даже если у каждого потока есть свой random_device ?Но даже если есть, то тогда thread_local никак не изменит ситуации.Насколько я помню, использовать отдельные объекты random_device в разных потоках - безопасно. Что-то я не могу найти подходящей цитаты, однако...
1
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,058
|
|
09.05.2022, 20:35 | 6 |
Сообщение было отмечено Miwa123 как решение
Решение
Я бы все-таки в такой ситуации вынес
std::random_sevice "за скобки". То есть использовал один-единственный std::random_sevice , с помощью которого генерировал бы seeds для каждого потока еще до запуска этих потоков и передавал бы эти seeds в потоки в качестве входных параметров.Дело в том, что std::random_sevice формально может быть реализован в том числе как детерминированный генератор псевдо-случайных чисел. То есть каждый std::random_sevice имеет право генерировать одну и ту же псевдослучайную последовательность. Тогда в вашем текущем варианте получится, что для каждого из ваших поточных std::mt19937 вы будете получать от его локального std::random_sevice один и тот же seed.
0
|
09.05.2022, 22:33 [ТС] | 7 | |||||
спасибо за комментарий. я пожалуй сделаю, именно так, как Вы и написали
создам внешний std::random_device и посею ним семя для каждого отдельного объекта потока. а зетам использую этим семена в локальном std::mt19937 Добавлено через 1 час 40 минут Кликните здесь для просмотра всего текста
чтобы не мучаться с изменением классов. как-то так придумал. в классе где нужно вызываю get_gen. полагаю так все будет исправно отрабатывать
0
|
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,790
|
|
09.05.2022, 22:37 | 8 |
0
|
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,790
|
||||||
09.05.2022, 22:54 | 10 | |||||
Поскольку это редкий вызов(только при первом вызове
get_gen в каждом потоке), то достаточно сделать его под блокировкой мьютекса, "производительность" не пострадает.Например
1
|
10.05.2022, 05:42 [ТС] | 11 |
блин, красивое однако решение.
а я уже полез мьютексы ставить в конструкторе объекта, который крутится в потоке и там намерено в блоке мьютекса делать первый принудительный вызов
0
|
10.05.2022, 05:42 | |
10.05.2022, 05:42 | |
Помогаю со студенческими работами здесь
11
Многопоточность Многопоточность Многопоточность Многопоточность Многопоточность Многопоточность Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |