C++ lectures at MIPT (in Russian). Lecture 13. Atomicity, part 3

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

В этой лекции мы завершаем атомарность, последнюю тему в многопоточном C++. Тонкие и сложные аспекты моделей памяти, очереди, свободные от блокировок и ещё больше задач для аудитории

Лектор: Константин Владимиров
Дата лекции: 17 марта 2020 года
Съёмка и звук: Дмитрий Рябцев

Errata:
* здесь пока пусто
Рекомендации по теме
Комментарии
Автор

Занятие 24 марта пройдёт онлайн в виде стрима на youtube.

В качестве текстового и голосового чата для вопросов будет использован дискорд. Туда же я скину ссылку на начавшуюся трансляцию.

tilir
Автор

Огромнейшее спасибо Константину, МФТИ и Intel за эти супер-лекции, и за то, что в итоге их всё-таки выложили публично!

Только хочется немного заступиться за C#: 19:55 - кажется, всё-таки не совсем так, в .NET есть value types, и, кажется, это было в своё время киллер-фичей по сравнению с JVM. Но в .NET это характеристика типа (помечен он как "struct" или "class"), а не собственно объекта.

И ещё одна неприятная особенность сборщика мусора - он портит RAII :(, вернее, для его поддержки приходится придумывать особые языковые конструкции.

allcreater_
Автор

Только мьютексы предоставляют модель памяти acquire/release а не sequential consistent этого досточно для задач мютекса. Да и ещё порядок очереди потоков ожидающие мютекс не определен, то есть не объязательно, что если поток А первый вошел в ожидание мютекса то он и первый выйдет.

xdtaux
Автор

Вопрос по фантастическому кейсу на 34:00. Все равно не особо ясно почему так происходит. Разве ptr->field.load(), не создаст барьер компилятора и хардварный барьер, которые запретят переупорядочивание ReadRead?

JohnWickMovie
Автор

42:00, слайд 103 и 44:20, слайд 104 --- основная проблема этого кода в том, что на каждый x.fetch_add() компилятор сгенерирует по сути CAS loop для ARM и тяжёлую LOCK-операцию для x86. А нам такое не нужно в этом конкретном примере --- у нас только один поток изменяет данные. Нам не нужно атомарно делать read-modify-write, достаточно только обеспечить порядок.


victormustya
Автор

1:13:13 --- alignas() мне тоже нравится больше. Но как ты сам заметил, у нас на arm-машине gcc 4.9.2 (-:

victormustya
Автор

Не совсем понимаю, как так? К моменту обращения красным потоком по p->next, по адресу 0xaec58 будет уже лежать другая структура, в которой next будет равняться 0xaec64. Не так ли?

thkdojj