|
Программирование >> Разработка устойчивых систем
5. В примере EvenChecker.h исправьте потенциальную ошибку в классе Generator (предположите, что операции bool не являются атомарными). 6. Измените пример EvenGenerator.cpp так, чтобы вместо флагов завершения в нем использовалась функция interrupt(). 7. В примере MutexEvenGenerator.cpp измените код MutexEvenGenerator::nexValue() так, чтобы команда возврата предшествовала команде release(). Объясните происходящее. 8. Измените пример ResponsiveUI.cpp так, чтобы вместо флага quitPlag в нем использовалась функция interrupt(). 9. Изучите документацию по объекту Singleton в библиотеке ZThreads. Измените пример OrnamentalGarden.cpp гак, чтобы объект Display контролировался объектом Singleton для предотвращения возможности создания нескольких экземпляров Display. 10. В примере OrnamentalGarden.cpp измените функцию Count::increment() так, чтобы она выполняла прямой инкремент count (то есть просто count++). Затем удалите стража и посмотрите, приведет ли это к сбою. Является ли такой вариант надежным и безопасным? 11. Измените программу OrnamentalGarden.cpp, чтобы она использовала вызов interruptO вместо механизма pause(). Убедитесь в том, что в вашем решении не происходит преждевременного уничтожения объектов. 12. Измените пример WaxOMatic.cpp и добавьте новые экземпляры класса Process, чтобы покрытие наносилось и полировалось не в один, а в три слоя. 13. Создайте два подкласса Runnable. В одном функция run() после запуска должна вызывать wait(), в другом функция run() должна сохранять ссылку на первый объект Runnable и после истечения заданного количества секунд вызывать signalO для первого потока, чтобы первый поток мог вывести сообщение. 14. Напишите пример с наличием активного ожидания. Один поток приостанавливается на некоторое время, а затем устанавливает флаг. Второй поток отслеживает этот флаг в цикле while (активное ожидание) и, когда флаг устанавливается, сбрасывает его и сообщает об изменении на консоль. Зафиксируйте, сколько лишнего времени проводит программа внутри цикла активного ожидания, и создайте вторую версию, которая использует функцию wait() вместо активного ожидания. Дополнительно можете измерить время, затрачиваемое процессором в обоих случаях, при помощи програм-мы-профайлера. 15. Измените файл TQueue.h и ограничьте максимальное допустимое количество элементов. При достижении заданного порога дальнейшая запись блокируется до тех пор, пока количество элементов не уменьшится. Напишите программу для тестирования новых возможностей. 16. Измените пример ToastOMaticMarkH.cpp так, чтобы готовить сэндвичи с арахисовым маслом и желе (половинки сэндвича должны изготавливаться на двух отдельных линиях). Готовые сэндвичи заносятся в выходную очередь TQueue. Для вывода результатов воспользуйтесь объектом Reporter, как это сделано в примере CarBuilder.cpp. 17. Перепишите пример C07:BankTeller.cpp так, чтобы вместо имитации в нем присутствовала нормальная многопоточность. 18. Измените пример CarBuilder.cpp, присвойте идентификаторы роботам и добавьте дополнительные экземпляры разных типов роботов. Проверьте, все ли роботы используются при сборке. 19. Измените пример CarBuilder.cpp и добавьте в процесс сборки новый этап с установкой системы выхлопа, кузова и крыльев. Как и на первом этапе, эти процессы могут выполняться роботами одновременно. 20. Измените пример CarBuilder.cpp и обеспечьте синхронизацию доступа ко всем переменным bool внутри Саг. Из-за невозможности копирования мутексов в программу придется внести существенные изменения. 21. Используя подход, продемонстрированный в примере CarBuilder.cpp, смоделируйте процесс строительства дома. 22. Создайте класс Timer с двумя режимами работы. В первом таймер должен сработать только один раз, во втором - срабатывать с регулярными промежутками. Воспользуйтесь этим классом в примере ClO:MulticastCommand.cpp и переместите вызовы TaskRunner::run() из процедур в таймер. 23. Измените оба примера с обедающими философами так, чтобы в командной строке можно было задать не только временные параметры, но и количество философов. Поэкспериментируйте с разными значениями и объясните результаты. 24. Измените пример DiningPhilosophers.cpp так, чтобы каждый философ просто брал свободные палочки (завершив еду, философ бросает палочки в общую корзину; когда философ хочет есть, он берет из корзины две свободные палочки). Устраняется ли при этом возможность взаимной блокировки? Можно ли снова ввести взаимную блокировку простым сокращением количества палочек? Список терминов Ниже приведен список основных терминов, используемых в книге. Термин Аббревиатура Перевод Abstract fectory Activation Record Instance Adaptable function object Adapter Adaptor Aggregation Allocator Applicator Argument-Dependent Lookup Assertion Associative container Asymptotic complexity Atomic operation Bidirectional iterator Binder Builder Busy wait Call chain Callback function Cast Chain of responsibility Class invariant Class template Cleaning up Qosure Collecting parameter Command Concurrency Container Container adaptor Container class Context Copy-on-write Critical section Deadlock Абстрактная фабрика Экземпляр активационной записи Адаптируемый объект функции Адаптер Адаптер Агрегирование Распределитель памяти Аппликатор Поиск с учетом аргументов Утверждение Ассоциативный контейнер Асимптотическая сложность Атомарная операция Двусторонний итератор Адаптер привязки Строитель Активное ожидание Цепочка вызовов Функция обратного вызова Преобразование типа Цепочка ответственности Инвариант класса Шаблон класса Зачистка Замыкание Накопитель Команда Параллельность Контейнер Контейнерный адаптер Контейнерный класс Контекст Копирование при записи Критическая секция Взаимная блокировка
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |