Программирование

244 группа

Юрий Литвинов

Студент TODO №1 №3 №5
43 Lazy MyThreadPool SimpleFTP
Виктория Фомина 3
Вологин Дмитрий 3
Гусев Егор 3
Донина Дарья 2
Дорожкин Сергей 3
Егорова Лада 2
Зиннатулин Тимур 2
Катричко Ульяна 3
Ким Юния 2
Костин Павел 3
Липаев Савелий 2
Мамро Никита 2
Мирошникова Мария 3
Паршин Максим 1
Родина Алина 2
Соболевская Надежда 2
Хованов Виктор 2
Щербина Олег 3

Задачи

Домашняя работа 7. 18.10.19
Работа с сетью, практика
Домашняя работа 6. 11.10.19
Работа с сетью, высокий уровень
Домашняя работа 5. 04.10.19
Работа с сетью, низкий уровень
  1. SimpleFTP

    Требуется реализовать сервер, обрабатывающий два запроса.

    • List — листинг файлов в директории на сервере
    • Get — скачивание файла с сервера

    И клиент, позволяющий исполнять указанные запросы.

    List, формат запроса:

    • <1: Int> <path: String>
    • path — путь к директории относительно того места, где запущен сервер

    Например, "1 ./Test/Files".

    Формат ответа:

    • <size: Int> (<name: String> <isDir: Boolean>)*,
    • size — количество файлов и папок в директории
    • name — название файла или папки
    • isDir — флаг, принимающий значение True для директорий

    Например, "2 ./Test/files/file1.txt false ./Test/files/directory true"

    Если директории не существует, сервер посылает ответ с size = -1

    Get, формат запроса:

    • <2: Int> <path: String>
    • path — путь к файлу

    Формат ответа:

    • <size: Long> <content: Bytes>,
    • size — размер файла,
    • content — его содержимое

    Если файла не существует, сервер посылает ответ с size = -1

    Обратите внимание на строгое следование протоколу. Сервер любого правильного решения должен уметь взаимодействовать с клиентом любого другого правильного решения.

Домашняя работа 4. 27.09.19
Высокоуровневая многопоточность
Домашняя работа 3. 20.09.19
Многопоточное программирование, практика
  1. MyThreadPool

    Реализовать простой пул задач (наподобие https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool?view=netframework-4.8 + https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskfactory?view=netframework-4.8) с фиксированным числом потоков (число задается в конструкторе)

    • При создании объекта MyThreadPool в нем должно начать работу n потоков
    • У каждого потока есть два состояния: ожидание задачи / выполнение задачи
    • Задача — вычисление некоторого значения, описывается в виде Func<TResult>
    • При добавлении задачи, если в пуле есть ожидающий поток, то он должен приступить к ее исполнению. Иначе задача будет ожидать исполнения, пока не освободится какой-нибудь поток
    • Задачи, принятые к исполнению, представлены в виде объектов интерфейса IMyTask<TResult>
    • Метод Shutdown должен завершить работу потоков. Завершение работы коллаборативное, с использованием CancellationToken — уже запущенные задачи не прерываются, но новые задачи не принимаются на исполнение потоками из пула.
      • Возможны два варианта решения --- дать всем задачам, которые уже попали в очередь, досчитаться, либо выбросить исключение во все ожидающие завершения задачи потоки
    • IMyTask
      • Свойство IsCompleted возвращает true, если задача выполнена
      • Свойство Result возвращает результат выполнения задачи
      • В случае, если соответствующая задаче функция завершилась с исключением, этот метод должен завершиться с исключением AggregateException, содержащим внутри себя исключение, вызвавшее проблему
      • Если результат еще не вычислен, метод ожидает его и возвращает полученное значение, блокируя вызвавший его поток
      • Метод ContinueWith — принимает объект типа Func<TResult, TNewResult>, который может быть применен к результату данной задачи X и возвращает новую задачу Y, принятую к исполнению
      • Новая задача будет исполнена не ранее, чем завершится исходная
      • В качестве аргумента объекту Func будет передан результат исходной задачи, и все Y должны исполняться на общих основаниях (т.е. должны разделяться между потоками пула)
      • Метод ContinueWith может быть вызван несколько раз
      • Метод ContinueWith не должен блокировать работу потока, если результат задачи X ещё не вычислен
      • ContinueWith должен быть согласован с Shutdown --- принятая как ContinueWith задача должна либо досчитаться, либо бросить исключение ожидающему её потоку.

    При этом:

    • В данной работе запрещено использование TPL, PLINQ и библиотечных классов Task и ThreadPool.
    • Все интерфейсные методы должны быть потокобезопасны
    • Для каждого базового сценария использования должен быть написан несложный тест
    • Также должен быть написан тест, проверяющий, что в пуле действительно не менее n потоков

    Подсказка: задачи могут быть разных типов (например, можно var myTask = myThreadPool.Submit(() => 2 * 2).ContinueWith(x => x.ToString());). Хранить такие задачи в очереди можно, обернув их в Action.

Домашняя работа 2. 13.09.19
Примитивы синхронизации
Домашняя работа 1. 06.09.19
Введение, многопоточное программирование
  1. Lazy

    Реализовать следующий интерфейс, представляющий ленивое вычисление:

    public interface ILazy<T> {
            T Get();
    }
    

    Объект Lazy создаётся на основе вычисления (представляемого объектом Func<T>)

    • Первый вызов Get() вызывает вычисление и возвращает результат
    • Повторные вызовы Get() возвращают тот же объект, что и первый вызов
    • Вычисление должно запускаться не более одного раза

    Создавать объекты надо не вручную, а с помощью класса LazyFactory, который должен иметь два метода с сигнатурами наподобие

    public static Lazy<T> Create...Lazy<T>(Func<T> supplier)
    

    возвращающих две разные реализации ILazy<T>:

    • Простая версия с гарантией корректной работы в однопоточном режиме (без синхронизации)
    • Гарантия корректной работы в многопоточном режиме
      • При этом она должна по возможности минимизировать число необходимых синхронизаций (если значение уже вычислено, не должно быть блокировок)
    • supplier вправе вернуть null
    • Библиотечным Lazy пользоваться, естественно, нельзя

    Нужно:

    • CI, на котором проходят ваши тесты
    • Тесты
      • Однопоточные, на разные хорошие и плохие случаи
      • Многопоточные, на наличие гонок

© 2014-2019 HwProj