![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| sstorm |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 8.4.2009 Репутация: нет Всего: нет |
прошу помощи в многопоточном программировании на с++.
1. Подскажите, как сделать генератор, возвращающий разные случайные значения потокам? Не знаю, по какой причине это случается, но даже если в каждом потоке вызвать srand, то всё равно числа, генерируемые затем будут попарно одинаковы. Т.е. если первый поток сгенерировал 1 9 5, то и все остальные *дцать потоков сгенерируют именно 1 9 5 в той же последовательности. Я пока что решил эту проблему, сделав rand()^proc_Num, но хотелось бы разобраться в вопросе. Я так для себя представил, что генератор 1 всего. И каждый следующий поток инициализирует его текущим временем при srand(). В итоге все потоки, выходит, получают одинаковые начальные значения (т.к. последний вызов сотрёт все ранние). Но ведь потом при любом rand() внутренние переменные генератора должны смениться и следующий вызов (который как бы в другом потоке) должен дать другое значение. но нет... Подскажите механику, пожалуйста. Ну или просто вариант решения 2. Ещё одна сложность с измерением времени работы. Мне бы хотелось увидеть время работы конкретного потока, а не общее время. Поясню: 10 потоков работают одновременно. Каждый делает 10 000 запросов. Я снимаю показания clock() до и после выполнения. Каждый поток затем печатает свою разность между временами. Каждый печатает нечто типа 3000 (3 секунды). Но я вся программа идёт 3 секунды. То есть это время "общее". Реально ли увидеть время работы конкретного потока...время, ему отведённое. То есть я бы хотел увидеть нечто типа 300 для каждого потока, просуммировав все значения, получил бы реальное время работы программы. В этом вопросе был бы рад просто указанием направления/функций, к которым надо присмотреться |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
|
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
потому что на самом деле генератор вовсе не случайный, а "как бы" случайный. Инициализация одинаковым значением генерирует строго одну и ту же последовательность. А текущее время возвращается с точностью до секунды (обычно). Железка за эту секунду много чего успевает. Просто инициализируй чем-то гарантированно разным. -------------------- ... |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Самый простой вариант, перед каждым вызовом srand увеличивать значение зерна (глобальная переменная или Singleton) на 1, или на то что вернёт rand, или на любое другое подходящее число. Потребуется мьютекс, иначе можно опять нарваться на одинаковые последовательности - т.е. сначала один поток увеличил зерно, потом другой и т.д. потом они все по очереди использовали полученное значение. Можно попробовать srand c количеством тактов процессора, но не думаю что получится переносимо. Это банальные решения. Можно поискать более "продвинутый" генератор. Добавлено @ 18:28
Они парралельно выполняются или нет? Время работы основного потока, который запускает все остальные и дожидается завершения последнего, самого длительного, будет больше времени работы этого потока на ту разницу во времени, когда был запущен основной поток, и когда был запущен этот поток. Ключевым здесь является то что они работают параллельно, даже если эта параллельность эмулируется ОСью, а процессор один на всех. Это сообщение отредактировал(а) Леопольд - 8.2.2010, 18:32 -------------------- вопросов больше чем ответов |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |