ЛЕКЦИЯ 3. Реентерабельность. Сигналы. Локальные данные потоков. Принудительное завершение потоков
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ЛЕКЦИЯ 4. Стандарт POSIX Threads. Реентерабельность функций. Обработка сигналов. Локальные данные потоков. Принудительное завершение потоков. Шаблоны программирования с использованием потоков
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
ЛЕКЦИЯ 5. Многопоточное программирование в языке С++. Работа с потоками. Защита данных. Синхронизация. Будущие результаты
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...Alexey Paznikov
ЛЕКЦИЯ 6. Атомарные операции. Внеочередное выполнение инструкций. Барьеры памяти. Семантика захвата-освобождения. Модель памяти C++
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ЛЕКЦИЯ 5. Шаблоны многопоточного программирования
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ЛЕКЦИЯ 8. Многопоточное программирование без использования блокировок. Модель потребитель-производитель. Потокобезопасный стек. Проблема ABA. Указатели опасности.
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...Alexey Paznikov
ЛЕКЦИЯ 6. Разработка параллельных структур данных на основе блокировок
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Доклад Кулагина И.И., Пазникова А.А., Курносова М.Г. "Оптимизация информационных обменов в параллельных PGAS-программах" на 3-й Всероссийской научно-технической конференции «Суперкомпьютерные технологии» (СКТ-2014)
29 сентября – 4 октября 2014 г., с. Дивноморское
ЛЕКЦИЯ 4. Шаблоны многопоточного программирования
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ЛЕКЦИЯ 4. Стандарт POSIX Threads. Реентерабельность функций. Обработка сигналов. Локальные данные потоков. Принудительное завершение потоков. Шаблоны программирования с использованием потоков
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
ЛЕКЦИЯ 5. Многопоточное программирование в языке С++. Работа с потоками. Защита данных. Синхронизация. Будущие результаты
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...Alexey Paznikov
ЛЕКЦИЯ 6. Атомарные операции. Внеочередное выполнение инструкций. Барьеры памяти. Семантика захвата-освобождения. Модель памяти C++
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ЛЕКЦИЯ 5. Шаблоны многопоточного программирования
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ЛЕКЦИЯ 8. Многопоточное программирование без использования блокировок. Модель потребитель-производитель. Потокобезопасный стек. Проблема ABA. Указатели опасности.
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...Alexey Paznikov
ЛЕКЦИЯ 6. Разработка параллельных структур данных на основе блокировок
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Доклад Кулагина И.И., Пазникова А.А., Курносова М.Г. "Оптимизация информационных обменов в параллельных PGAS-программах" на 3-й Всероссийской научно-технической конференции «Суперкомпьютерные технологии» (СКТ-2014)
29 сентября – 4 октября 2014 г., с. Дивноморское
ЛЕКЦИЯ 4. Шаблоны многопоточного программирования
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
ЛЕКЦИЯ 2. POSIX Threads. Жизненный цикл потоков. Планирование. Синхронизация
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ЛЕКЦИЯ 7. Многопоточное программирование без блокировок. Модель потребитель-производитель. Потокобезопасный стек: проблема ABA, указатели опасности, сборщики мусора, счётчик ссылок, применение модели памяти С++.
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ЛЕКЦИЯ 1. Актуальность параллельных вычислений. Анализ параллельных алгоритмов. Многоядерные вычислительные систем с общей памятью
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
Зачастую, знакомство с алиасингом в C++ у многих программистов начинается и заканчивается одинаково: -fno-strict-aliasing. На вопросы новичка, более опытные коллеги отвечают в стиле: «не трогай! а то все сломаешь!». Новичок и не трогает. В докладе будет предпринята попытка заглянуть под капот и понять, что же там, внутри. Что такое алиасинг, где он может быть полезен и какие реальные преимущества дает. Тема будет рассмотрена и со стороны программиста и со стороны разработчика компилятора. А по сему, вопрос «зачем?» будет центральным в повествовании.
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
В последнее время в промышленной разработке ПО особую популярность обретают Domain-Specific Lanugages (DSL). Они драматически упрощают разработку и дают возможность “программировать” не только программистам, но и пользователям прикладных программ.
В своем докладе я расскажу об опыте использования DSL применительно к С++, причем упор будет сделан на производительность кода DSL, и его мгновенную “встраиваемость” в запущенную программу путем компиляции DSL-кода в нативный код с помощью инструментария LLVM.
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...Alexey Paznikov
ЛЕКЦИЯ 7. Модель памяти С++. Атомарные операции. Внеочередное выполнение инструкций. Барьеры памяти. Семантика захвата-освобождения
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...Alexey Paznikov
ЛЕКЦИЯ 2. Коллективные операции в стандарте MPI
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
http://cpct.sibsutis.ru/~apaznikov/teaching
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
Алексей Куканов, Intel.
Последняя версия стандарта С++ добавляет в язык и библиотеку поддержки средства для использования потоков исполнения (threads) и синхронизации между ними. Однако это лишь необходимая низкоуровневая база для внедрения параллелизма. Эффективная разработка параллельных программ требует высокоуровневого API, реализующего типичные шаблоны использования параллелизма в виде, пригодном для применения в широком спектре алгоритмов и приложений. В докладе речь пойдёт о наиболее часто встречающихся параллельных шаблонах, реализованных в программных моделях Intel® Threading Building Blocks и Intel® Cilk Plus, и о примерах их использования.
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияPlatonov Sergey
В этом докладе Дмитрий кратко рассказывает о таком звере, как LLVM, о котором много кто слышал, но немногие щупали.
Что такое компилятор на самом деле? Как происходит компиляция программы, как работают оптимизации и, наконец, откуда берется неопределенное поведение в детерменированных программах на C++?
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
За время работы над проектом был разработан удобный фреймворк для написания асинхронного кода. В докладе будет рассмотрено то, как он устроен и как со временем эволюционировал. Разберемся, как с помощью наших примитивов решать проблемы, часто встречающиеся в асинхронном программирование; будут примеры удачного и неудачного использования. Отдельно остановимся на сравнении получившихся средств с тем, что было добавлено в С++11.
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
Практика показывает, что использование подхода, основанного на колбеках для асинхронного программирования обычно не является удобным и подвержено различным ошибкам. Для упрощения написания и поддержки сложных асинхронных программ можно использовать несколько иной подход: использовать сопрограммы для переключения контекста на время ожидания события. Такой подход позволяет реализовать интересные неблокирующие примитивы, включая неблокирующее сетевое взаимодействие, неблокирующие мьютексы, а также удобное переключение между различными пулами потоков для разнесения выполнения задач, которые требуют различные ресурсы.
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
В докладе рассмотрены подходы к созданию надежных юнит-тестов, которые просты в поддержке и модернизации, а также принципы создания кода пригодного для покрытия автотестами. Приведены два способа внедрения зависимости: с использованием конструктора тестируемого объекта, а также с использованием подхода "выделить и переопределить". Каждый из способов разобран на примере, демонстрирующем особенности его реализации и применения. Приведен ряд практических советов, нацеленных на создание надежных юнит-тестов. Использование на практике приведенных подходов и принципов позволяет упростить процесс поддержки и модификации существующего кода, а также дает уверенность в надежности работы добавляемого нового функционала. В конечном итоге это приводит к повышению качества разрабатываемого продукта.
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
ЛЕКЦИЯ 2. POSIX Threads. Жизненный цикл потоков. Планирование. Синхронизация
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ЛЕКЦИЯ 7. Многопоточное программирование без блокировок. Модель потребитель-производитель. Потокобезопасный стек: проблема ABA, указатели опасности, сборщики мусора, счётчик ссылок, применение модели памяти С++.
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ЛЕКЦИЯ 1. Актуальность параллельных вычислений. Анализ параллельных алгоритмов. Многоядерные вычислительные систем с общей памятью
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
Зачастую, знакомство с алиасингом в C++ у многих программистов начинается и заканчивается одинаково: -fno-strict-aliasing. На вопросы новичка, более опытные коллеги отвечают в стиле: «не трогай! а то все сломаешь!». Новичок и не трогает. В докладе будет предпринята попытка заглянуть под капот и понять, что же там, внутри. Что такое алиасинг, где он может быть полезен и какие реальные преимущества дает. Тема будет рассмотрена и со стороны программиста и со стороны разработчика компилятора. А по сему, вопрос «зачем?» будет центральным в повествовании.
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
В последнее время в промышленной разработке ПО особую популярность обретают Domain-Specific Lanugages (DSL). Они драматически упрощают разработку и дают возможность “программировать” не только программистам, но и пользователям прикладных программ.
В своем докладе я расскажу об опыте использования DSL применительно к С++, причем упор будет сделан на производительность кода DSL, и его мгновенную “встраиваемость” в запущенную программу путем компиляции DSL-кода в нативный код с помощью инструментария LLVM.
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...Alexey Paznikov
ЛЕКЦИЯ 7. Модель памяти С++. Атомарные операции. Внеочередное выполнение инструкций. Барьеры памяти. Семантика захвата-освобождения
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...Alexey Paznikov
ЛЕКЦИЯ 2. Коллективные операции в стандарте MPI
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
http://cpct.sibsutis.ru/~apaznikov/teaching
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
Алексей Куканов, Intel.
Последняя версия стандарта С++ добавляет в язык и библиотеку поддержки средства для использования потоков исполнения (threads) и синхронизации между ними. Однако это лишь необходимая низкоуровневая база для внедрения параллелизма. Эффективная разработка параллельных программ требует высокоуровневого API, реализующего типичные шаблоны использования параллелизма в виде, пригодном для применения в широком спектре алгоритмов и приложений. В докладе речь пойдёт о наиболее часто встречающихся параллельных шаблонах, реализованных в программных моделях Intel® Threading Building Blocks и Intel® Cilk Plus, и о примерах их использования.
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияPlatonov Sergey
В этом докладе Дмитрий кратко рассказывает о таком звере, как LLVM, о котором много кто слышал, но немногие щупали.
Что такое компилятор на самом деле? Как происходит компиляция программы, как работают оптимизации и, наконец, откуда берется неопределенное поведение в детерменированных программах на C++?
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
За время работы над проектом был разработан удобный фреймворк для написания асинхронного кода. В докладе будет рассмотрено то, как он устроен и как со временем эволюционировал. Разберемся, как с помощью наших примитивов решать проблемы, часто встречающиеся в асинхронном программирование; будут примеры удачного и неудачного использования. Отдельно остановимся на сравнении получившихся средств с тем, что было добавлено в С++11.
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
Практика показывает, что использование подхода, основанного на колбеках для асинхронного программирования обычно не является удобным и подвержено различным ошибкам. Для упрощения написания и поддержки сложных асинхронных программ можно использовать несколько иной подход: использовать сопрограммы для переключения контекста на время ожидания события. Такой подход позволяет реализовать интересные неблокирующие примитивы, включая неблокирующее сетевое взаимодействие, неблокирующие мьютексы, а также удобное переключение между различными пулами потоков для разнесения выполнения задач, которые требуют различные ресурсы.
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
В докладе рассмотрены подходы к созданию надежных юнит-тестов, которые просты в поддержке и модернизации, а также принципы создания кода пригодного для покрытия автотестами. Приведены два способа внедрения зависимости: с использованием конструктора тестируемого объекта, а также с использованием подхода "выделить и переопределить". Каждый из способов разобран на примере, демонстрирующем особенности его реализации и применения. Приведен ряд практических советов, нацеленных на создание надежных юнит-тестов. Использование на практике приведенных подходов и принципов позволяет упростить процесс поддержки и модификации существующего кода, а также дает уверенность в надежности работы добавляемого нового функционала. В конечном итоге это приводит к повышению качества разрабатываемого продукта.
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
Евгений Крутько, НИЦ «Курчатовский институт».
В докладе на примере программы моделирования динамики движения конструкций по методу конечных элементов рассматриваются возможности и практика распараллеливания вычислений. Речь в нём пойдёт как о технике создания новых вычислительных потоков, так и об использовании стандартов openMP и MPI.
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
http://techtalks.nsu.ru
Видеозапись: http://www.youtube.com/watch?v=v7uBLSm6ft8
06 октября 2015. Как приручить дракона: введение в LLVM (Дмитрий Кашицын, HDsoft)
«В этом докладе мы кратко расскажем о таком звере, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.»
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
10 июня 2015. Дмитрий Кашицын (HDsoft) дает обзор LLVM.
http://techtalks.nsu.ru
Видеозапись: https://plus.google.com/events/ctes98f7uhf19t5jlvlbk24dan4
В этом докладе мы кратко расскажем о таком звере, как LLVM, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
Надежный обмен данными в гетерогенной среде, между разными платформами и технологиями является одним из ключевых моментов разработки сложных систем. Во время обмена данные преобразуются в некоторый промежуточный формат совместимый между платформами. Преобразование в подобный формат и из него — крайне рутинная и подверженная ошибкам работа.
Метаописание данных неким декларативным языком с последующей автогенерацией типизированных структур облегчает жизнь разработчику. Снимает с него необходимость задумываться о промежуточном формате, о правильном порядке полей, а типизированность гарантирует выявление ошибок еще на этапе компиляции кода.
В докладе будет рассмотрено несколько подобных решений, их плюсы и минусы. Также будет рассмотрен с практической стороны наш собственный формат метаданных, используемый нами на протяжении более 5 лет.
Целевая аудитория:
Ограничений нет, но в большей степени разработчики, имеющие уже определенный опыт разработки разнородных систем или приступающие к подобной задаче.
ЛЕКЦИЯ 3. Стандарт POSIX Threads
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Yandex
Научно-технический семинар «DTrace: Проверочная работа для вашего кода» в петербургском офисе Яндекса, 29 ноября 2012 г.
Филипп Торчинский, эксперт по облачным технологиям, Семоникс.
ЛЕКЦИЯ 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллельный ввод-вывод в MPI
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
http://cpct.sibsutis.ru/~apaznikov/teaching
Лекция 5. Метод конечных разностей (параллельные алгоритмы в стандарте MPI)Alexey Paznikov
ЛЕКЦИЯ 5. Метод конечных разностей (параллельные алгоритмы в стандарте MPI)
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
http://cpct.sibsutis.ru/~apaznikov/teaching
Лекция 4. Производные типы данных в стандарте MPIAlexey Paznikov
ЛЕКЦИЯ 4. Производные типы данных в стандарте MPI
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
http://cpct.sibsutis.ru/~apaznikov/teaching
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...Alexey Paznikov
ЛЕКЦИЯ 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI умножения матрицы на вектор, метода Монте-Карло, решение линейных алгебраических уравнений (СЛАУ) методами Гаусса и сопряжённых градиентов
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
http://cpct.sibsutis.ru/~apaznikov/teaching
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыAlexey Paznikov
ЛЕКЦИЯ 1. Основные понятия стандарта MPI. Дифференцированные обмены
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
http://cpct.sibsutis.ru/~apaznikov/teaching
ЛЕКЦИЯ 0. Описание курса. Общие вопросы, структура курса, требования. Содержание курса. Полезные ресурсы
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ПВТ - осень 2014 - Лекция 2 - Архитектура вычислительных систем с общей памятьюAlexey Paznikov
ЛЕКЦИЯ 2. Архитектура вычислительных систем с общей памятью
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ЛЕКЦИЯ 1. Введение в параллельные вычисления
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ЛЕКЦИЯ 1а. Описание курса "Параллельные вычислительные технологии" (ПВТ), осень 2014
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных системСибирский государственный университеттелекоммуникаций и информатики
ЛЕКЦИЯ 11. Технико-экономическая эффективность функционирования вычислительных систем
Пазников Алексей Александрович
к.т.н., ст. преп. Кафедры вычислительных системСибирский государственный университеттелекоммуникаций и информатики
ЛЕКЦИЯ 10. Осуществимость решения задач на вычислительных системах
Пазников Алексей Александрович
к.т.н., ст. преп. Кафедры вычислительных системСибирский государственный университеттелекоммуникаций и информатики
ЛЕКЦИЯ 9. Показатели структурной живучести распределённых ВС
Пазников Алексей Александрович
к.т.н., ст. преп. Кафедры вычислительных системСибирский государственный университеттелекоммуникаций и информатики
ЛЕКЦИЯ 8. Расчёт функций потенциальной живучести распределённых вычислительных систем
Пазников Алексей Александрович
к.т.н., ст. преп. Кафедры вычислительных системСибирский государственный университеттелекоммуникаций и информатики
ЛЕКЦИЯ 7. Методика расчета показателей живучести ВС. Континуальный подход к анализу живучести большемасштабных ВС.
Пазников Алексей Александрович
к.т.н., ст. преп. Кафедры вычислительных системСибирский государственный университеттелекоммуникаций и информатики
ЛЕКЦИЯ 5. Живучие ВС. Потенциальная и структурная живучесть ВС. Показатели потенциальной живучести ВС
Пазников Алексей Александрович
к.т.н., ст. преп. Кафедры вычислительных системСибирский государственный университеттелекоммуникаций и информатики
3. Реентерабельность
▪ Одну функцию может вызывать (re-enter)
несколько потоков.
▪ Функции, которые могут безопасно вызываться
из нескольких потоков, называются
безопасными в многопоточной среде или
потокобезопасными (thread-safe)
▪ Все функции, определённые стандартом
Single UNIX Specification, являтся
потокобезопасными, за исключением ...
3
5. Реентерабельность
▪ У некоторых функций есть альтернативные
потокобезопасные версии
▪ Например, изменяется интерфейс: результат
не возвращается буфере, размещенном
статически
acstime__r
ctime_r
getgrgid.r
getgrnam_r
getlogin_r
getpwnam_r
getpwuid_r
gmtime_r
localtime_r
rand_r
readdir_r
strerror_r
strtok_r
ttyname_r
5
6. Посимвольный ввод-вывод без блокировки:
Безопасный способ управления объектами FILE
void flockfile(FILE *filehandle);
int ftrylockfile(FILE *filehandle);
void funlockfile(FILE *filehandle);
int getc_unlocked(FILE *stream);
int getchar_unlocked(void);
int putc_unlocked(int c, FILE *stream);
int putchar_unlocked(int c);
Функции должны быть окружены вызовами
flockfile и funlockfile
6
7. Нереентерабельная версия функции getenv
static char envbuf[ARG_MAX];
extern char **environ;
char *getenv(const char *name)
{
int i, len;
len = strlen(name);
for (i = 0; environ[i] != NULL; i++) {
if ((strncmp(name, environ[i], len) == 0)
&& (environ[i][len] == '=')) {
strcpy(envbuf, &environ[i][len + 1]);
return envbuf;
}
}
return NULL;
} 7
8. Потокобезопасная версия функции getenv
int getenv_r(const char *name, char *buf, int buflen) {
int i, olen, len = strlen(name);
pthread_once(&init_done, thread_init);
pthread_mutex_lock(&env_mutex);
for (i = 0; environ[i] != NULL; i++) {
if ((strncmp(name, environ[i], len) == 0) &&
(environ[i][len] == '=')) {
olen = strlen(&environ[i][len+1]);
if (olen >= buflen) {
pthread_mutex_unlock(&env_mutex); return ENOSPC;
}
strcpy(buf, &environ[i][len+1]);
pthread_mutex_unlock(&env_mutex); return O;
}
}
pthread_mutex_unlock(&env_mutex); return ENOENT;
} 8
9. int getenv_r(const char *name, char *buf, int buflen) {
int i, olen, len = strlen(name);
pthread_once(&init_done, thread_init);
pthread_mutex_lock(&env_mutex);
for (i = 0; environ[i] != NULL; i++) {
if ((strncmp(name, environ[i], len) == 0) &&
(environ[i][len] == '=')) {
olen = strlen(&environ[i][len+1]);
if (olen >= buflen) {
pthread_mutex_unlock(&env_mutex); return ENOSPC;
}
strcpy(buf, &environ[i][len+1]);
pthread_mutex_unlock(&env_mutex); return O;
}
}
pthread_mutex_unlock(&env_mutex); return ENOENT;
}
Потокобезопасная версия функции getenv
1
2
9
10. int getenv_r(const char *name, char *buf, int buflen) {
int i, olen, len = strlen(name);
pthread_once(&init_done, thread_init);
pthread_mutex_lock(&env_mutex);
for (i = 0; environ[i] != NULL; i++) {
if ((strncmp(name, environ[i], len) == 0) &&
(environ[i][len] == '=')) {
olen = strlen(&environ[i][len+1]);
if (olen >= buflen) {
pthread_mutex_unlock(&env_mutex); return ENOSPC;
}
strcpy(buf, &environ[i][len+1]);
pthread_mutex_unlock(&env_mutex); return O;
}
}
pthread_mutex_unlock(&env_mutex); return ENOENT;
}
Потокобезопасная версия функции getenv
R/W-мьютексы?
10
14. Локальные данные потоков
▪ Необходимость сохранять данные,
специфичные для конкретного потока.
▪ Данные одного потока не должны быть
изменены другим потоком.
▪ “Таблица” данных не годится: идентификаторы
потоков не целые, не известно заранее, сколько
будет потоков.
▪ Необходим способ для адаптации к
многопоточной среде (например, так было в
случае с errno)
▪ Каждый поток может использовать локальные
данные, не прибегая к синхронизации.
14
17. Создание ключа локальных данных
/* Создать ключ, ассоциированный с лок. данными */
int pthread_key_create(pthread_key_t *key,
void (*destructor)(void*));
key - ключ (идентификатор локальных данных)
destructor - деструктор локальных данных
▪ Ключ может использоваться разными потоками.
▪ Каждый поток ассоциирует с ключом отдельный набор
локальных данных.
▪ С ключом можно связать фунукцию-деструктор,
которая вызывается в случае штатного (не exit, abort)
завершения потока.
▪ Поток может создать несколько ключей. По
завершении потока запускаются деструктор для всех
ненулевых ключей. 17
18. Создание и удаление ключа локальных данных
/* Разорвать связь ключа с локальными данными */
int pthread_key_delete(pthread_key_t *key);
▪ Вызов не приводит к деструктору ключа.
/* Создать ключ, ассоциированный
* с локальными данными */
int pthread_key_create(pthread_key_t *key,
void (*destructor)(void*));
key - ключ (идентификатор локальных данных)
destructor - деструктор локальных данных
18
19. Создание ключа локальных данных
Ключ должен инициироваться атомарно и один раз!
void destructor(void *);
pthread_key_t key;
int init_done = 0;
int threadfunc(void *arg)
{
if (!init_done) {
init.done = 1;
err = pthread_key_create(&key, destructor);
}
}
19
20. void destructor(void *);
pthread_key_t key;
int init_done = 0;
int threadfunc(void *arg)
{
if (!init_done) {
init.done = 1;
err = pthread_key_create(&key, destructor);
}
}
Создание ключа локальных данных
Ключ должен инициироваться атомарно и один раз!
20
21. Создание и удаление ключа локальных данных
/* функция initfn вызывается один раз при первом
* обращении к pthrad_once */
pthread_once_t initflag = PTHREAD_ONCE_INIT;
int pthread_once(pthread_once_t *initflag,
void (*initfn)(void));
void destructor(void *);
pthread_key_t key;
pthread_once_t init_done = PTHREAD_ONCEINIT;
void thread_init(void) {
err = pthread_key_create(&key, destructor);
}
int threadfunc(void *arg) {
pthread_once(&init_done, thread_init);
}
21
22. Ассоциация ключа с локальными данными
/* вернуть указатель на область памяти с локальными
* данными (или NULL) */
void *pthread_getspecific(pthread_key_t key);
/* связать ключ с локальными данными */
int pthread_setspecific(pthread_key_t key,
const void *value);
22
23. Локальные данные потоков - пример
pthread_key_t key;
void *foo(void *arg) {
int *newdata = (int *) pthread_getspecific(key);
if (newdata == NULL) {
newdata = (int *) malloc(sizeof(int));
int *argval = (int *) arg;
*newdata = *argval;
pthread_setspecific(key, newdata);
}
int *data = (int *) pthread_getspecific(key);
printf("data = %dn", *data);
return NULL;
}
23
24. Локальные данные потоков - пример
int main(int argc, const char *argv[]) {
pthread_t tid1, tid2;
int arr[2] = {1234, 5678};
pthread_key_create(&key, NULL);
pthread_create(&tid1, NULL, foo, &arr[0]);
pthread_create(&tid2, NULL, foo, &arr[1]);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;
}
24
25. Локальные данные потоков - пример 2
static pthread_key_t key;
static pthread_once_t init_done = PTHREAD_ONCE_INIT;
pthread_mutex_t env_mutex =
PTHREADMUTEX_INITIALIZER;
extern char **environ;
static void thread_init(void)
{
pthread_key_create(&key, free);
}
char *getenv(const char *name) {
int i, len;
char *envbuf;
25
26. Локальные данные потоков - пример 2
pthread_once(&init_done, thread_init);
pthread_mutex_lock(&env_mutex);
envbuf = (char *) pthread_getspecific(key);
if (envbuf == NULL) {
envbuf = malloc(ARG_MAX);
if (envbuf == NULL) {
pthread_mutex_unlock(&env_mutex);
return NULL;
}
pthread_setspecific(key, envbuf);
}
26
27. Локальные данные потоков - пример 2
len = strlen(name);
for (i = 0; environ[i] != NULL; i++) {
if ((strncmp(name, environ[i], len) == 0) &&
(environ[i][len] == '=')) {
strcpy(envbuf, &environ[i][len+1]);
pthread_mutex_unlock(&env_mutex);
return envbuf;
}
}
pthread_mnutex_unlock(&env_mutex);
return NULL;
}
27
29. Потоки и сигналы
▪ Каждый поток имеет собственную маску потоков.
▪ Отдельно взятый поток может заблокировать
доставку сигнала.
▪ Когда поток назначает обработчик сигнала, он
становится общим для всех потоков. То есть
сигналы могут “противоречить” друг другу.
▪ Сигнал доставляется только одному потоку. Если
сигнал связан с аппаратной ошибкой или
таймером, то доставляется потоку, который стал
причиной. Остальные сигналы могут
доставляться произвольному потоку.
29
30. Задать маску сигналов для потока
/* задать маску обработчиков сигналов */
int pthread_sigmask(int how, const sigset_t *set,
sigset_t *oldset);
▪ если oldset != NULL, в него возвращается текущая
маска сигналов
▪ если в set передается непустой указатель, то значение
how определяет, как должна измениться маска сигналов
▪ how == SIG_BLOCK - новая маска - объединение текущей
маски и с набором, указанным в set
▪ how == SIG_UNBLOCK - новая маска - пересечение
текущей маски с набором, на который указывает set
▪ how == SIG_SETMASK - новая маска set замещает текущую
маску
30
31. Ожидания поступления сигнала потоком
/* приостановиться в ожидании хотя бы одного
* сигнала из set, сохранить поступивший сигнал
* в sig */
int sigwait(const sigset_t *set, int *sig);
▪ Сигнал удаляется из набора сигналов, ожидающих
обработки.
▪ Во избежании ошибочной обработки, поток должен
заблокировать (pthread_sigmask) сигналы перед
вызовом sigwait. Иначе сигнал может быть доставлен
▪ sigwait позволяет синхронно обрабатывать асинхронные
сигналы
▪ Можно выделить отдельные потоки, которые будут
заниматься только обработкой сигналов
31
32. Передача сигнала потоку
/* приостановиться в ожидании хотя бы одного
* сигнала из set, сохранить поступивший сигнал
* в sig */
int sigwait(const sigset_t *set, int *sig);
/* передать сигнал потоку */
int pthread_kill(pthread_t thread, int sig);
▪ Можно проверить существование потока, передав sig = 0
▪ Если действие по умолчанию для сигнала - завершение
процесса, то передача сигнала потоку приведёт к
завершению всего процесса
▪ n.b. таймеры являются ресурсами процесса
32
33. Потоки и сигналы - пример
int quitflag; /* поток записывает ненулевое значение */
sigsetjt mask;
pthread_mutex_t: lock = PTHREAD_MUTEX_ITIALIZER;
pthread_cond_t wait = PTHREAD_COND_INITIALIZER;
void *thr_fn(void *arg) {
int err, signo;
for (;;) {
err = sigwait(&mask, &signo);
if (err != 0) {
fprintf(stderr, "sigwait failed"); exit(1); }
33
34. Потоки и сигналы - пример
switch (signo) {
case SIGINT:
printf("interruption");
break;
case SIGQUIT:
pthread_mutex_lock(&lock);
quitflag = 1;
pthread_mutex_unlock(&lock);
pthread_cond_signal(&wait);
return O;
default:
fprintf(stderr, "undef. signal %dn", signo);
exit(1)
}
}} 34
35. Потоки и сигналы - пример
int main(void) {
int err; sigset_t oldmask; pthread_t tid;
sigemptyset(&mask);
sigaddset(&mask, SIGINT); sigaddset(&mask, SIGQUIT);
if ((err = pthread_sigmask(SIG_BLOCK, &mask,
&oldmask)) != 0) {
fprintf(stderr, "SIG_BL0CK failed"); exit(1); }
err = pthread_create(&tid, NULL, thr_fn, 0);
if (err != 0) {
fprintf(stderr, "can’t create thread"); exit(1); }
pthread_mutex_lock(&lock);
while (quitflag == 0)
pthread_cond_wait(&wait, &lock);
pthread_mutex_unlock(&lock);
35
36. Потоки и сигналы - пример
/* Сигнал SIGQUIT был перехвачен и сейчас
* опять заблокирован. */
quitflag = 0;
/* Восстановить маску сигналов, в которой
* SIGQUIT разблокирован. */
if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) {
fprintf(stderr, "SIG_SETMASK failed");
exit(O);
}
}
36
38. Принудительное завершение потоков
/* установить атрибут принудительного завершения
* oldstate - старое значение атрибута */
int pthread_setcancelstate(int state,
int *oldstate);
PTHREAD_CANCEL_ENABLE - вызов pthread_cancel приводит
к тому, что поток продолжает работу до
точки выхода. Точки выхода определены стандартом.
PTHREAD_CANCEL_DISABLE - вызов pthread_cancel не
приводит к завершению потока.
/* задать точку выхода из потока: если есть
* ожидающий запрос, то поток завершит работу */
void pthread_testcancel(void);
38
39. Тип завершения потока
/* задать тип выхода */
int pthread_setcanceltype(int type, int *oldtype);
PTHREAD_CANCEL_DEFERRED - отложенный выход (до точки
выхода)
PTHREAD_CANCEL_ASYNCHRONOUS - немедленный выход из
потока при поступлении запроса
39
40. Тип завершения потока
/* задать тип выхода */
int pthread_setcanceltype(int type, int *oldtype);
PTHREAD_CANCEL_DEFERRED - отложенный выход (до точки
выхода)
PTHREAD_CANCEL_ASYNCHRONOUS - немедленный выход из
потока при поступлении запроса
40
41. Действия потоков при принудительном завершении
При завершении потока необходимо убедиться:
▪ Поток должен освободить все блокировки,
которые он удерживает.
▪ Поток должен освободить выделенную память.
▪ Поток должен завершиться в корректном
состоянии.
Асинхронная отмена может привести
к нежелательным последствиям!
41
42. Обработчки отмены потока (cancellation cleanup handlers)
function 3 arg 3
function 2 arg 2
function 1 arg 1
Cleanup Stack
pthread_cleanup_push() pthread_cleanup_pop()
▪ Обработчики позволяют очистить состояние
потока: выполнить какие-то действия при отмене.
▪ Функции 3-1 запускаются при отмене потока или
срабатывания pthread_exit.
42
43. Обработчки отмены потока (cancellation cleanup handlers)
▪ pthread_cleanup_push и pthread_cleanup_pop
должны вызываться на одном уровне.
pthread_cleanup_push(free, pointer);
...
pthread_cleanup_pop(1);
pthread_cleanup_push(free, pointer);
...
}
pthread_cleanup_pop(1);
43
44. Обработчки отмены потока (cancellation cleanup handlers)
▪ pthread_cleanup_push и pthread_cleanup_pop
должны вызываться на одном уровне.
pthread_cleanup_push(free, pointer);
...
pthread_cleanup_pop(1);
pthread_cleanup_push(free, pointer);
...
}
pthread_cleanup_pop(1);
44
53. Пример (сигналы, отмена потоков)
pthread_cleanup_push(cleanup_death, NULL);
for (;;) {
fprintf(stderr, "I am %sn", name);
pthread_mutex_lock(&file_lock);
pthread_cleanup_push(cleanup_lock, NULL);
file = fopen(FILENAME, "a");
pthread_cleanup_push(cleanup_file, NULL);
fprintf(file, "%s was heren",
(char *) pthread_getspecific(key_name));
pthread_cleanup_pop(0);
fclose(file);
pthread_cleanup_pop(0);
pthread_mutex_unlock(&file_lock);
pthread_testcancel();
sleep(1);
}
pthread_cleanup_pop(0); return NULL; }
53
54. Пример (сигналы, отмена потоков)
void *grim_reaper(void *arg)
{
for (;;) {
int signo;
int rc = sigwait(&mask, &signo);
if (rc != 0) {
fprintf(stderr, "sigwait() failed");
exit(1);
}
54
55. Пример (сигналы, отмена потоков)
switch (signo) {
case SIGQUIT:
printf("SIGQUIT receivedn");
if (nalive > 0) {
struct drand48_data rand48_buffer;
srand48_r(time(NULL), &rand48_buffer);
int rc;
do {
long int char_id;
lrand48_r(&rand48_buffer, &char_id);
char_id %= NTHREADS;
rc = pthread_cancel(tid[char_id]);
} while (rc == ESRCH);
}
break;
default: printf("Unspec. signaln"); exit(1);
} } } /* end of the function */
55
56. Пример (сигналы, отмена потоков)
$ ./signal_cleanup
I am Rosencrantz and I am writing to the file
I am Guildenstern and I am writing to the file
I am Polonius and I am writing to the file
I am Claudius and I am writing to the file
I am Gertrude and I am writing to the file
I am Ophelia and I am writing to the file
I am Hamlet and I am writing to the file
I am Laertes and I am writing to the file
I am Rosencrantz and I am writing to the file
I am Guildenstern and I am writing to the file
I am Polonius and I am writing to the file
I am Claudius and I am writing to the file
I am Gertrude and I am writing to the file
I am Ophelia and I am writing to the file
I am Hamlet and I am writing to the file
56
57. Пример (сигналы, отмена потоков)
SIGQUIT received
cleanup_death
key destructor
I am Gertrude and I am writing to the file
I am Guildenstern and I am writing to the file
I am Ophelia and I am writing to the file
I am Laertes and I am writing to the file
I am Polonius and I am writing to the file
I am Hamlet and I am writing to the file
I am Rosencrantz and I am writing to the file
I am Gertrude and I am writing to the file
I am Guildenstern and I am writing to the file
I am Ophelia and I am writing to the file
I am Laertes and I am writing to the file
I am Hamlet and I am writing to the file
I am Polonius and I am writing to the file
pkill -SIGQUIT signal_cleanup
57
58. Пример (сигналы, отмена потоков)
SIGQUIT received
cleanup_death
key destructor
I am Gertrude and I am writing to the file
I am Laertes and I am writing to the file
I am Ophelia and I am writing to the file
I am Rosencrantz and I am writing to the file
I am Hamlet and I am writing to the file
I am Polonius and I am writing to the file
I am Gertrude and I am writing to the file
I am Laertes and I am writing to the file
I am Ophelia and I am writing to the file
I am Rosencrantz and I am writing to the file
I am Hamlet and I am writing to the file
I am Polonius and I am writing to the file
I am Rosencrantz and I am writing to the file
pkill -SIGQUIT signal_cleanup
58
59. Пример (сигналы, отмена потоков)
SIGQUIT received
cleanup_death
key destructor
I am Gertrude and I am writing to the file
I am Laertes and I am writing to the file
I am Gertrude and I am writing to the file
I am Laertes and I am writing to the file
I am Gertrude and I am writing to the file
I am Laertes and I am writing to the file
I am Gertrude and I am writing to the file
I am Laertes and I am writing to the file
I am Gertrude and I am writing to the file
I am Laertes and I am writing to the file
I am Gertrude and I am writing to the file
I am Laertes and I am writing to the file
I am Gertrude and I am writing to the file
pkill -SIGQUIT signal_cleanup
59
60. Пример (сигналы, отмена потоков)
SIGQUIT received
cleanup_death
key destructor
I am Gertrude and I am writing to the file
I am Gertrude and I am writing to the file
I am Gertrude and I am writing to the file
I am Gertrude and I am writing to the file
I am Gertrude and I am writing to the file
I am Gertrude and I am writing to the file
I am Gertrude and I am writing to the file
I am Gertrude and I am writing to the file
I am Gertrude and I am writing to the file
SIGQUIT received
cleanup_death
The last character is dead.
key destructor
pkill -SIGQUIT signal_cleanup
pkill -SIGQUIT signal_cleanup
60
61. Пример (сигналы, отмена потоков)
$ cat play
Laertes was here
Rosencrantz was here
Guildenstern was here
Polonius was here
Claudius was here
Gertrude was here
Polonius is dead
Hamlet was here
Laertes was here
…
Laertes was here
Gertrude was here
Hamlet was here
Ophelia is dead
Rosencrantz was here
61
62. Пример (сигналы, отмена потоков)
Laertes was here
Gertrude was here
Laertes was here
Gertrude was here
Laertes was here
Gertrude was here
Laertes was here
Laertes is dead
Gertrude was here
Gertrude was here
Gertrude was here
Gertrude was here
Gertrude was here
Gertrude was here
Gertrude is dead
The rest is silence.
62