Всем привет! Вопрос к знатокам: можно ли (ориентируясь на разработку на C++ под FreeBSD 4.8) создать механизм подкачки с помощью исключений? Что-то типа:
1. Читаем порцию
2. Обрабатываем
3. Если обработка прерывается из-за того,что нужна следующая порция,бросается исключение
4.Обрабатываем исключение (подкачкой очередного фрагмента) и возвращаем
управление в то место обрабатывающей функции, где нужны очередные данные (и отсутствие которых и привело к исключению).Заранее спасибо!
Алексей
>можно ли (ориентируясь на разработку на C++
>под FreeBSD 4.8) создать механизм подкачки с помощью исключений? Что-то типа:можно, но по моему очень неплохо было бы и без них.
вообще в любом стандартном компиляторе С++
исключения одинаковые, на какой бы операционной системе он не был.
и под что бы не компилировал.
try
exceptну и throw соответственно.
Но совать сюда исключения - плохая затея. (хотя Страуструпу бы понравилась :)) ).
лучше возвращай просто ошибку.
или еще лучше - в одном потоке обрабатывай, а в другом подкачивай.
когда даные кончаются - генерируешь как-нибудь событие в поток подкачки
(мол чего тормозишь), а в потоке обработки ждешь, пока тот не сгенерирует событие - "все, кончил".
возникновения?!? Точнее-вернуться в место, непосредственно предшествующее его возникновению (иначе в этой затее нет смысла?
нет
А как ты собираешся "возвращать" управление ?Посмотри лучше на man mmap пусть VMM делает тоже самое, но на аппаратном уровне ;-) в винде тоже есть аналог.
всю эту беду (порядка 100 Гб! :)) Mmapить stdin IMHO затруднительно :))
>всю эту беду (порядка 100 Гб! :)) Mmapить stdin IMHO затруднительно :))
>
да 100 гиг на ia32 не от mmap-иш, что-нибудь 64 разрядное нужно ;-)Но с исключениями остаются проблемы:
А как ты собираешся "возвращать" управление ?
stack unwind - далеко несамый быстрый процесс, хотя если вызывать не чаще чем на каждые 100 метров, то терпимо для 100 гиг ;-)
никак...Типа, если данные в буфере кончились-мы копируем их остаток в начало и дочитываем следующий фрагмент файла до конца буфера.Если не получилос=>временно расширяем его...Тупо, как гнутый гвоздь...