Что это
В 2018 году я вёл практикум «Многопоточное программирование» в НГУ. Это шпаргалка с темами для разговора со студентами. Список задач
Лабораторные 1-4
- Что такое поток, как он выглядит в памяти?
- Чем отличаются процесс и поток? Чем отличаются fork() и pthread_create()?
- Как ОС выделяет процессорное время для потоков и процессов? Планировщик по-разному относится к потокам и процессам? Можно ли сделать свой собственный планировщик потоков (в обход ОС)? Это где-нибудь применяется?
- К каким переменным имеет доступ поток? Что такое область видимости? Если из нескольких потоков вызвать функцию со static переменной внутри, у потоков будут её копии или значение будет общее?
- Где находится стек потока? Куда мапит mmap с параметром MAP_ANONYMOUS? Где находится куча потока?
- Чем отличаются pthread_exit() и return? Можно ли завершить main() и продолжить что-то считать? Если да, как это сделать?
- Что такое pthread_t?
- Из какого потока можно вызывать pthread_join()? Какие потоки нельзя заджойнить?
- В чем разница между waitpid() и pthread_join()?
- Как передать несколько параметров в тред?
- Может ли поток вместо void* принимать custom_type*? Что такое указатель на функцию и где в памяти хранится функция? Нужно ли кастовать NULL к void*? Если нужно, то когда?
- В мане pthread_create есть секция ATTRIBUTES. Что значит табличка в ней?
Лабораторные 4-18
- pthread_cancel может отменять потоки синхронно и асинхронно. В чём разница? Когда можно использовать асинхронные отмены? Когда поток понимает, что его отменили?
- Что такое блокирующийся системный вызов? Как понять, что $syscallname блокирующийся?
- Какие задачи CPU-bound, а какие IO-bound? Как понять, сколько потоков нужно создавать в программе для максимального использования железа?
- Какой поток обрабатывает сигналы, посылаемые процессу? Как сделать так, чтобы все сигналы обрабатывал специальный поток? Какие функции можно вызывать в обработчике сигналов? printf можно?
- Как можно изменить условие задачи о философах так, чтобы блокировки были не нужны? Каждый философ должен жить в своём потоке.
- Что такое race condition? Протоколы когерентности кэша как-нибудь спасают от рейсов? С помощью какого инструмента можно проверить свою программу на race condition’ы?
- В чём разница между PTHREAD_MUTEX_INITIALIZER и pthread_mutex_init?
- Чем семафор отличается от мутекса? Почему у них такие названия?
- В чём разница между семафорами posix и семафорами system v?
- Что такое критическая секция? Зачем может быть нужна пустая критическая секция? Так вообще можно делать?
- Что лучше не делать в критической секции? Долгие критические секции – это нормально?
- При обработке ошибок отпускание локов может выглядеть очень некрасиво (в каждом ветвлении)? Как эту проблему решают в C++ или Java, например?
- Как бороться с priority inversion на локах?
- pthread_cond_wait сначала отпускает мутекс, а потом захватывает его. Это спасает от дедлоков?
- Можно ли вызывать pthread_mutex_lock из обработчика сигнала?
- Что будет, если поток ждёт на pthread_mutex_lock и приходит сигнал? Что будет с pthread_cond_wait? Почему так?
- Как можно сделать livelock и deadlock? Как с ними бороться?
- Как сделан и работает lock_guard в С++?
- На каком железе может получиться так, что каким-то потокам проще захватить мутекс, чем другим?
- Почему блокировки начинают работать медленно, если за них соревнуются много потоков?
- Приведите популярный приём программирования, в котором потоку нужно только читать свою переменную, а писать в переменные других потоков. Что такое akka, если вкратце?
- Скажите пару слов о неблокирующей синхронизации. Что такое lock-free, wait-free? Как это можно реализовать? Какие популярные lock-free структуры данных есть?
- Верно ли, что всё есть файл? (Смотри The Art of UNIX Programming)