Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Генератор и измерение времени в потоках

36K
05 февраля 2010 года
sstorm
55 / / 25.03.2009
Извините, но я снова прошу помощи в многопоточном программировании на с++.
1. Подскажите, как сделать генератор, возвращающий разные случайные значения потокам? Не знаю, по какой причине это случается, но даже если в каждом потоке вызвать srand, то всё равно числа, генерируемые затем будут попарно одинаковы. Т.е. если первый поток сгенерировал 1 9 5, то и все остальные *дцать потоков сгенерируют именно 1 9 5 в той же последовательности. Я пока что решил эту проблему, сделав rand()^proc_Num, но хотелось бы разобраться в вопросе. Я так для себя представил, что генератор 1 всего. И каждый следующий поток инициализирует его текущим временем при srand(). В итоге все потоки, выходит, получают одинаковые начальные значения (т.к. последний вызов сотрёт все ранние). Но ведь потом при любом rand() внутренние переменные генератора должны смениться и следующий вызов (который как бы в другом потоке) должен дать другое значение. но нет... Подскажите механику, пожалуйста. Ну или просто вариант решения
2. Ещё одна сложность с измерением времени работы. Мне бы хотелось увидеть время работы конкретного потока, а не общее время. Поясню: 10 потоков работают одновременно. Каждый делает 10 000 запросов. Я снимаю показания clock() до и после выполнения. Каждый поток затем печатает свою разность между временами. Каждый печатает нечто типа 3000 (3 секунды). Но я вся программа идёт 3 секунды. То есть это время "общее". Реально ли увидеть время работы конкретного потока...время, ему отведённое. То есть я бы хотел увидеть нечто типа 300 для каждого потока, просуммировав все значения, получил бы реальное время работы программы. В этом вопросе был бы рад просто указанием направления/функций, к которым надо присмотреться
1.9K
06 февраля 2010 года
GreenRiver
451 / / 20.07.2008
1. Генераторы случайных чисел завязаны, на том, что генерация первого значения опирается на текущее системное время или сид (некоторое число, которое задается программистом). Т.к. потоки стартуют одновременно, генераторы в потоках выдают одинаковый результат. Можно решить проблему, общим генератором, который будет генерировать сиды для генераторов в потоках.
2. Вы хотите получить чистое процессорное время затраченное в каждом потоке? Затрудняюсь сказать как это можно сделать, это нужно отлавливать момент переключения контекста, и считать время с учетом этого, плюс с учетом, что потоки могут выполняться на разных ядрах. Может быть есть какие-то функции ОС, которые позволяют это сделать?!?!
8.4K
06 февраля 2010 года
z0rch
275 / / 02.09.2008
Цитата: sstorm
Мне бы хотелось увидеть время работы конкретного потока



может быть Rdtsc?

36K
06 февраля 2010 года
sstorm
55 / / 25.03.2009
GreenRiver, в том и дело, что потоки стартуют не совсем одновременно. Нечто типа
for (int i = 0; i<n; ++i) { threads.create_thread(&myFunc); }
И внутри myFunc srand()...
Но про генератор для сидов генератора - это классная с виду идея. Я отпишусь о результатах чуть позже. Спасибо!
Про второй вопрос да, примерно так я и хочу)

z0rch, спасибо, сейчас изучу эту тему
1
06 февраля 2010 года
kot_
7.3K / / 20.01.2000
Цитата: sstorm


z0rch, спасибо, сейчас изучу эту тему


и не забываем о многоядерных системах.

1.9K
07 февраля 2010 года
GreenRiver
451 / / 20.07.2008
Цитата: sstorm
GreenRiver, в том и дело, что потоки стартуют не совсем одновременно. Нечто типа
for (int i = 0; i<n; ++i) { threads.create_thread(&myFunc); }


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

Кстати я немного погуглил и похоже, что поведение rand зависит от компилятора, есть многопоточные реализации стандартной библиотеки, а есть нет (пруфлинк).
Судя по всему у вас многопоточная и задание разных сидов должно помочь.

Вот тут есть несколько реализаций генераторов в виде классов. Там же говорят, что в TR1 появился класс генератора (который взят из boost'а, так что если компилятор не поддерживает TR1 можно взять оттуда).

36K
07 февраля 2010 года
sstorm
55 / / 25.03.2009
вторая ссылка очень интересна, спасибо.

Кстати, вчера попробовал сделать так и в принципе результат устроил:
внутри функции, которую выполняют все потоки, вызывал srand(time(NULL)+psNum);
psNum - это параметр функции-потоку, который я передавал, чтобы при печати в консоли выводить и было понятно, какой поток сообщает. Т.е. просто числа от 1 до кол-ва потоков
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог