Магистерский курс C++ (МФТИ, 2022-2023). Лекция 19. Многопоточность, часть 2.

preview_player
Показать описание
Лекции в магистратуре МФТИ по современному C++ на русском языке. Кафедра микропроцессорных технологий.

Продолжая многопоточность мы теперь должны познакомиться со всем находящимся в наших руках инструментарием. В первую очередь мы рассмотрим одноразовую инициализацию и разберём известный антипаттерн double-checked lock. Далее мы перейдём к идее условных переменных и введём понятия uniuque_lock, нотификаций и внезапных пробуждений. Потом нас ждёт много попыток понять что же происходит в нашем многопоточном приложении. Ну и под конец мы зароемся глубже в разделяемые и прочие виды блокировок.

Лектор: Константин Владимиров.
Дата лекции: 22 марта 2023 года.
Съёмка и звук: Юлий Тарасов.

Timeline:
00:00 Консенсус компиляторов
04:28 Одноразовая инициализация
08:20 DCL и std::once_flag
17:40 События и оповещения
27:20 Unique lock и spurious wakeup
38:40 Сеанс чёрной магии и фокусы strace
47:40 Упражения и задания в perf
52:25 Mutable mutex
57:35 Разделяемые блокировки
01:09:34 Остальные типы блокировок
01:15:34 Размеры основных типов и литература

Errata:
* ждёт ваших комментариев
Рекомендации по теме
Комментарии
Автор

Отличная лекция, очень интересно. Крутой, заинтересованный преподаватель. Спасибо)

vladalu
Автор

Большое спасибо за лекцию! Очень интересно

ivanlosev
Автор

Вдруг не видели, есть книга : Параллельное программирование на современном С++, 2022, Райнер Гримм. Читается полегче, чем Энтони Вильямс.

Tiolych
Автор

В примере на 41:30 метод wait сначала проверяет предикат, то есть вызов
void wait( std::unique_lock<std::mutex>& lock, Predicate stop_waiting );
то же самое, что
while (!stop_waiting())
{
wait(lock);
}
а std::cout << "w"; дает фору потоку preparation захватить мьютекс и выполнить инкремент раньше, чем оба оставшихся потока уйдут в ожидание. Но это лишь мое предположение

LuriDDD
Автор

Под wsl perf можно вроде бы просто собрать, исходники есть на гитхабе в WSL2-Linux-Kernel/tools/perf. Но пока собирать не пробовал.

sempaidebil
Автор

Константин Игоревич, спасибо за лекцию! А как насчет парочки доп. семинаров - факультативов по оптимизации с использованием VTune и подобного? Было бы просто замечательно :)

VladMazurenko-lo
Автор

Константин, спасибо за лекцию!
1:09:22 - то есть, шаред мутекс будет выгоден только тогда, когда под юник лок будет что-то тяжёлое, я правильно понимаю?
Но этого же обычно не бывает. Там всегда что-то лёгкое.
Выходит, лучше пользоваться обычным мутексом (после измерений, конечно же :) ) ?

alex_s_ciframi
Автор

Про shared_mutex стало понятно, что при малом размере критической секции он сильно проигрывает обычному мьютексу. Но есть ли достойная альернатива для подобного типа синхронизации?

tyzjar
Автор

Возможно, забегаю вперёд, но интересно, есть ли в плане лекций корутины?

KoSeAn
Автор

13:33 да вроде не ломается. UB есть в первой проверке по синей стрелке. Допустим, 100 первых потоков из миллиона проходят первый if(!resptr), а мютекс захватил только 1 из них, остальные 99 ждут освобождения или ещё читают первое условие. Этот 1-й поток проходит 2-ю проверку, создаёт ресурс и уходит. Остальные 99 по очереди входят в критическую секцию и на 2-м ифе видят, что ресурс уже создан... И где здесь UB? :) Если вставить какой-то код между первой проверкой и lock_guard тогда плохо, но это уже будет не DCL, как я понимаю.
UPD: тогда выходит, что проблема может быть в 101-м потоке? 1-й поток записал resptr частично, но этого хватило, чтоб 101-й уже не прошёл 1-ю проверку, но не хватило, чтоб вызвать функцию use() корректно? Если const функция, например, читает состояние, а его там нет.

test_bot
Автор

у меня вот концептуальный вопрос назрел -- а могут ли компиляторы обладать описанием, что они предоставляют возможность компиляции С++ кода, если они настолько часто плюют на стандарт? -- ведь если именно валидная программа согласно стандарту не работает должным образом при ее компиляции компилятором -- то компилятор компилирует по правилам, отличным от стандарта с++... Тоесть по факту компилятор не с++, а собственного диалекта с некоторыми оговорками. В таком случае юридически они обязаны не называться компиляторами с++.

safocl
Автор

как всегда выше всяких похвал. большое спасибо за ваши труды!

sigasigasiga