Конференция "Прочее" » На что заменить критические секции в Vista?
 
  • Добежал (18.12.08 17:38) [0]
    Имеем я так подозреваю стандартную задачу: некий поток выполняет работу. Работа эта описана в конкретных последовательных задачах, которые ему "присылаюся" извне. Ну допустим структура аля:

    PTask = ^TTask;
    TTask = record
     Action: TActionProcedure;
     Data: TData;
    end;



    Представим, что такого типа записи хранятся в некоем списке List.
    Что делает поток? Из этого списка выбирает задания и основываясь на Action и Data что-то там делает. Потом выбирает следующее задание, выполняет его... И так далее, и так далее.

    Чтобы добавить задание - нужно внести в этот список новую запись, ну понятно.

    Остается вопрос синхронизации. Логично сделать этот список обычным TThreadList, ну или в целом синхронизировать с помощью критических секций. Но тут нас ожидает дикая засада в операционной системе Vista (заводил об этом тему здесь уже). Там изменили, "оптимизировали" критический секции, и так получается, что если поток активно работает со списком - то внешний поток, желающий добавить задание в этот список - может ждать невероятно долго. Рабочий поток может успеть СОТНИ раз (по времени это десятки секунд) войти и выйти в критическую секцию, синхронизирующую этот список, а внешний поток так и будет на ней висеть. То есть, в Vista полностью сняли принцип "первый в очереди - первый прошел" с критических секций (если такой принцип вообще был).

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

    Вопрос - а что собственно делать для реализации сего действия? Сейчас я отказался от критических секций, сделал так сказать TThreadList, но основанный не на критичских секциях, а на Event'ах - там принцип "первый - первый" - видимо, пока поддерживается. Правильно ли я сделал? Какая гарантия, что в будущем MS отменит этот принцип и для Event'ов?

    Как правильно реализовать задачу?
 
Конференция "Прочее" » На что заменить критические секции в Vista?
Есть новые Нет новых   [134449   +17][b:0][p:0.001]