+ Ответить в теме
Показано с 1 по 6 из 6.

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

  1. #1
    dummy
    coder
    MrBrain is on a distinguished road
    Регистрация
    14.05.2009
    Сообщений
    19

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

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

  2. #2
    developer BulldozerBSG is on a distinguished road
    Регистрация
    09.01.2010
    Сообщений
    140

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

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

  3. #3
    Moderator Куратор
    system architect
    WinMain is on a distinguished road Аватар для WinMain
    Регистрация
    14.01.2005
    Адрес
    Москва
    Сообщений
    785

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

    Ерунда это всё. Если процессору нужно выполнить 1 миллион итераций цикла, то выполнит он их в одном потоке или в 4 потоках по 250 тыс. - в сумме все равно будет 1 миллион итераций. Поэтому суммарное время выполнения процедуры за счёт многопоточности не уменьшится. Другое дело, если распределить вычисления на несколько разных машин или на несколько процессоров внутри одной машины. К тому же Windows не является системой реального времени и не распределяет ресурсы процессора равномерно между потоками. Поэтому нельзя надеяться, что все потоки будут выполняться одновременно и с одинаковой скоростью. С помощью объектов синхронизации (Event, Mutex, Semaphor и др.) можно лишь приостанавливать один поток, чтобы дать возможность другому потоку завершить какие-то действия. Но в результате синхронизации потоков лишь увеличивается общее время выполнения процедур.
    Последний раз редактировалось WinMain; 23.06.2010 в 20:42.
    If you think you know very much, you don't know how many is unknown for you.

  4. #4
    system architect somewhere will become famous soon enough somewhere will become famous soon enough Аватар для somewhere
    Регистрация
    31.08.2006
    Адрес
    71 RUS
    Сообщений
    1,285

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

    В данной задаче теряется основной смысл потока - его независимость и параллельность. Получается что потоки работают поочередно, а это, как сказал WinMain, только увеличит время выполнения.
    Квантами времени выполнения потока управляет ядро операционной системы на основе прерываний, получаемых от системного таймера, приоритета процесса, кол-ва ядер и пр. информации. Ручное управление потоками мне видется в создании отдельного параллельного управляющего потока, который, грубо говоря будет спать 1/3 сек., потом переключать основные потоки, потом опять спать 1/3 сек.
    Другой способ, основаный на прерывании таймера, менее хорош, т.к. необходимо после N операции в теле рабочего потока опрашивать окно на предмет пришедшего к нему сообщения WM_TIMER. Это будет делать кванты неровными и увеличивать время выполнения основных процедур.
    It's a long way to the top if you wanna rock'n'roll

  5. #5
    dummy
    coder
    MrBrain is on a distinguished road
    Регистрация
    14.05.2009
    Сообщений
    19

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

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

  6. #6
    dummy Ilyxa is on a distinguished road
    Регистрация
    28.07.2010
    Сообщений
    6

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

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

+ Ответить в теме

Похожие темы

  1. синхронизация потоков в JavaScript
    By __Yuri__ in forum JScript, VBScript, DHTML...
    Replies: 0
    Последнее сообщение: 21.08.2007, 11:00
  2. Использование потоков (Thread)
    By TCoder in forum Win API, Shell..
    Replies: 5
    Последнее сообщение: 10.08.2007, 13:03
  3. Replies: 10
    Последнее сообщение: 21.03.2007, 13:12
  4. Replies: 4
    Последнее сообщение: 26.10.2006, 03:35
  5. как разделить?
    By marapapale in forum MS Office и VB(A).
    Replies: 2
    Последнее сообщение: 05.07.2006, 09:40

Ваши права в разделе

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения