Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Генераторы и измерение времени в многопоточном


Автор: sstorm 6.2.2010, 00:14
прошу помощи в многопоточном программировании на с++.
1. Подскажите, как сделать генератор, возвращающий разные случайные значения потокам? Не знаю, по какой причине это случается, но даже если в каждом потоке вызвать srand, то всё равно числа, генерируемые затем будут попарно одинаковы. Т.е. если первый поток сгенерировал 1 9 5, то и все остальные *дцать потоков сгенерируют именно 1 9 5 в той же последовательности. Я пока что решил эту проблему, сделав rand()^proc_Num, но хотелось бы разобраться в вопросе. Я так для себя представил, что генератор 1 всего. И каждый следующий поток инициализирует его текущим временем при srand(). В итоге все потоки, выходит, получают одинаковые начальные значения (т.к. последний вызов сотрёт все ранние). Но ведь потом при любом rand() внутренние переменные генератора должны смениться и следующий вызов (который как бы в другом потоке) должен дать другое значение. но нет... Подскажите механику, пожалуйста. Ну или просто вариант решения
2. Ещё одна сложность с измерением времени работы. Мне бы хотелось увидеть время работы конкретного потока, а не общее время. Поясню: 10 потоков работают одновременно. Каждый делает 10 000 запросов. Я снимаю показания clock() до и после выполнения. Каждый поток затем печатает свою разность между временами. Каждый печатает нечто типа 3000 (3 секунды). Но я вся программа идёт 3 секунды. То есть это время "общее". Реально ли увидеть время работы конкретного потока...время, ему отведённое. То есть я бы хотел увидеть нечто типа 300 для каждого потока, просуммировав все значения, получил бы реальное время работы программы. В этом вопросе был бы рад просто указанием направления/функций, к которым надо присмотреться

Автор: xvr 8.2.2010, 13:08
Цитата

Я так для себя представил, что генератор 1 всего. 
Нет, на каждый поток свой
Цитата

И каждый следующий поток инициализирует его текущим временем при srand().
Да, и потом они все начинают возвращать одно и то же

Автор: Earnest 8.2.2010, 16:29
Цитата(xvr @  8.2.2010,  14:08 Найти цитируемый пост)
Да, и потом они все начинают возвращать одно и то же

потому что на самом деле генератор вовсе не случайный, а "как бы" случайный. Инициализация одинаковым значением генерирует строго одну и ту же последовательность. А текущее время возвращается с точностью до секунды (обычно). Железка за эту секунду много чего успевает. Просто инициализируй чем-то гарантированно разным.

Автор: Леопольд 8.2.2010, 18:21
Цитата(Earnest @  8.2.2010,  16:29 Найти цитируемый пост)
Просто инициализируй чем-то гарантированно разным.

Самый простой вариант, перед каждым вызовом srand увеличивать значение зерна (глобальная переменная или Singleton) на 1, или на то что вернёт rand, или на любое другое подходящее число. Потребуется мьютекс, иначе можно опять нарваться на одинаковые последовательности - т.е. сначала один поток увеличил зерно, потом другой и т.д. потом они все по очереди использовали полученное значение.

Можно попробовать srand c количеством тактов процессора, но не думаю что получится переносимо.

Это банальные решения.

Можно поискать более "продвинутый" генератор.

Добавлено @ 18:28
Цитата(sstorm @  6.2.2010,  00:14 Найти цитируемый пост)
Каждый печатает нечто типа 3000 (3 секунды). Но я вся программа идёт 3 секунды. 

Они парралельно выполняются или нет? smile Если они все начинают работать и заканчивают работать в одно и тоже время, то промежуток времени будет одинаковый для всех.

Время работы основного потока, который запускает все остальные и дожидается завершения последнего, самого длительного, будет больше времени работы этого потока на ту разницу во времени, когда был запущен основной поток, и когда был запущен этот поток.

Ключевым здесь является то что они работают параллельно, даже если эта параллельность эмулируется ОСью, а процессор один на всех.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)