Генератор и измерение времени в потоках
1. Подскажите, как сделать генератор, возвращающий разные случайные значения потокам? Не знаю, по какой причине это случается, но даже если в каждом потоке вызвать srand, то всё равно числа, генерируемые затем будут попарно одинаковы. Т.е. если первый поток сгенерировал 1 9 5, то и все остальные *дцать потоков сгенерируют именно 1 9 5 в той же последовательности. Я пока что решил эту проблему, сделав rand()^proc_Num, но хотелось бы разобраться в вопросе. Я так для себя представил, что генератор 1 всего. И каждый следующий поток инициализирует его текущим временем при srand(). В итоге все потоки, выходит, получают одинаковые начальные значения (т.к. последний вызов сотрёт все ранние). Но ведь потом при любом rand() внутренние переменные генератора должны смениться и следующий вызов (который как бы в другом потоке) должен дать другое значение. но нет... Подскажите механику, пожалуйста. Ну или просто вариант решения
2. Ещё одна сложность с измерением времени работы. Мне бы хотелось увидеть время работы конкретного потока, а не общее время. Поясню: 10 потоков работают одновременно. Каждый делает 10 000 запросов. Я снимаю показания clock() до и после выполнения. Каждый поток затем печатает свою разность между временами. Каждый печатает нечто типа 3000 (3 секунды). Но я вся программа идёт 3 секунды. То есть это время "общее". Реально ли увидеть время работы конкретного потока...время, ему отведённое. То есть я бы хотел увидеть нечто типа 300 для каждого потока, просуммировав все значения, получил бы реальное время работы программы. В этом вопросе был бы рад просто указанием направления/функций, к которым надо присмотреться
2. Вы хотите получить чистое процессорное время затраченное в каждом потоке? Затрудняюсь сказать как это можно сделать, это нужно отлавливать момент переключения контекста, и считать время с учетом этого, плюс с учетом, что потоки могут выполняться на разных ядрах. Может быть есть какие-то функции ОС, которые позволяют это сделать?!?!
for (int i = 0; i<n; ++i) { threads.create_thread(&myFunc); }
И внутри myFunc srand()...
Но про генератор для сидов генератора - это классная с виду идея. Я отпишусь о результатах чуть позже. Спасибо!
Про второй вопрос да, примерно так я и хочу)
z0rch, спасибо, сейчас изучу эту тему
Цитата: sstorm
z0rch, спасибо, сейчас изучу эту тему
и не забываем о многоядерных системах.
Цитата: sstorm
GreenRiver, в том и дело, что потоки стартуют не совсем одновременно. Нечто типа
for (int i = 0; i<n; ++i) { threads.create_thread(&myFunc); }
for (int i = 0; i<n; ++i) { threads.create_thread(&myFunc); }
Стартуют они конечно по очереди, но т.к. частота процессора очень высокая это происходит достаточно быстро, чтобы все генераторы получили одно и то же системное время.
Кстати я немного погуглил и похоже, что поведение rand зависит от компилятора, есть многопоточные реализации стандартной библиотеки, а есть нет (пруфлинк).
Судя по всему у вас многопоточная и задание разных сидов должно помочь.
Вот тут есть несколько реализаций генераторов в виде классов. Там же говорят, что в TR1 появился класс генератора (который взят из boost'а, так что если компилятор не поддерживает TR1 можно взять оттуда).
Кстати, вчера попробовал сделать так и в принципе результат устроил:
внутри функции, которую выполняют все потоки, вызывал srand(time(NULL)+psNum);
psNum - это параметр функции-потоку, который я передавал, чтобы при печати в консоли выводить и было понятно, какой поток сообщает. Т.е. просто числа от 1 до кол-ва потоков