Страница 1 из 1

Разделить время выполнения потоков (С#)

Добавлено: 23 июн 2010, 14:01
MrBrain
Я только начал изучать потоки, так что возможно это нубский вопрос, но как организовать чтобы если работает только один поток, то весь квант времени (1 сек) отдавался ему, если работает 2 потока, то каждый из них получает по 1/2 сек, три потока – по 1/3 сек и т.д., все потоки выполняют 1 зацикленную процедуру ? Пожалуйста помогите, никак не пойму :(

Re: Разделить время выполнения потоков (С#)

Добавлено: 23 июн 2010, 16:54
BulldozerBSG
работу которую они должны выполнить разделяй по потокам. Предположим в работу входит обработка 90 элементов независимо друг от друга. если эту работу выполняет 1 поток ему достанутся все 90 элементов. Если работу разделить на 2 потока то каждому достанется по 45 элементов. Если на 3 потока то по 30 элементов. Предположим один поток выполнит обработку 90 элементов за 1 секунду, тогда за это же время выполнят работу и 2 потока, каждый будет её выполнять по 1/2 секунды и т.д.

Re: Разделить время выполнения потоков (С#)

Добавлено: 23 июн 2010, 20:39
WinMain
Ерунда это всё. Если процессору нужно выполнить 1 миллион итераций цикла, то выполнит он их в одном потоке или в 4 потоках по 250 тыс. - в сумме все равно будет 1 миллион итераций. Поэтому суммарное время выполнения процедуры за счёт многопоточности не уменьшится. Другое дело, если распределить вычисления на несколько разных машин или на несколько процессоров внутри одной машины. К тому же Windows не является системой реального времени и не распределяет ресурсы процессора равномерно между потоками. Поэтому нельзя надеяться, что все потоки будут выполняться одновременно и с одинаковой скоростью. С помощью объектов синхронизации (Event, Mutex, Semaphor и др.) можно лишь приостанавливать один поток, чтобы дать возможность другому потоку завершить какие-то действия. Но в результате синхронизации потоков лишь увеличивается общее время выполнения процедур.

Re: Разделить время выполнения потоков (С#)

Добавлено: 24 июн 2010, 09:04
somewhere
В данной задаче теряется основной смысл потока - его независимость и параллельность. Получается что потоки работают поочередно, а это, как сказал WinMain, только увеличит время выполнения.
Квантами времени выполнения потока управляет ядро операционной системы на основе прерываний, получаемых от системного таймера, приоритета процесса, кол-ва ядер и пр. информации. Ручное управление потоками мне видется в создании отдельного параллельного управляющего потока, который, грубо говоря будет спать 1/3 сек., потом переключать основные потоки, потом опять спать 1/3 сек.
Другой способ, основаный на прерывании таймера, менее хорош, т.к. необходимо после N операции в теле рабочего потока опрашивать окно на предмет пришедшего к нему сообщения WM_TIMER. Это будет делать кванты неровными и увеличивать время выполнения основных процедур.

Re: Разделить время выполнения потоков (С#)

Добавлено: 24 июн 2010, 10:47
MrBrain
Всем спасибо за помощь. Наверное в задании имелось ввиду что просто нужно одновременно запустить несколько процессов использующих 1 область отрисовки (процедуры рисуют графики), я для этого закрыл доступ к ней с помощью lock.

Re: Разделить время выполнения потоков (С#)

Добавлено: 28 июл 2010, 08:33
Ilyxa
Ну тут, если честно, сложно разделить кванты точно, по 1/n на каждый из n потоков. Как тут правильно сказали, задача решается объектами синхронизации, в данном случае, критическими секциями (lock). Однако, этот механизм сможет гарантировать лишь то, что сумма квантов, отданных потокам, будет равна общему кванту. Однако количество итераций, выполненных в каждом потоке, может существенно различаться, что приведет к тому, что потоки будут выполняться "неровно", один опережая другую. Если нужно квантовать точно, можно поступить 2мя путями: первый путь - ввести доп. синхронизатор общего времени выполнения и изменить процедуру потока так, чтобы, если поток идет "с опережением", то он застревал на данной точке в бесконечном цикле (ни в коем случае не засыпал!); второй путь - если не хочется менять процедуру - ввести поток-диспетчер, который будет суспендить-резюмить потоки в зависимости от их "скорости" (как уже было сказано).