Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Генераторы и измерение времени в многопоточном, rand() -> ? ; clock() -> ? 
:(
    Опции темы
sstorm
Дата 6.2.2010, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 для каждого потока, просуммировав все значения, получил бы реальное время работы программы. В этом вопросе был бы рад просто указанием направления/функций, к которым надо присмотреться
PM MAIL   Вверх
xvr
Дата 8.2.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата

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

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

PM MAIL   Вверх
Earnest
Дата 8.2.2010, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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

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


--------------------
...
PM   Вверх
Леопольд
Дата 8.2.2010, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



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

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

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

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

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

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

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

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

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

Это сообщение отредактировал(а) Леопольд - 8.2.2010, 18:32


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0510 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.