Обзор книги C++ Concurrency in Action: Practical Multithreading

concur_in_action

Данная книга написана Энтони Вильямсом(Anthony Williams) в начале 2012 года. Энтони Вильямс человек в написании книг новый, насколько мне известно это его первая и единственная книга. Мой выбор пал на неё по весьма простой причине – книг по многопоточности днём с огнём не сыщешь, а уже по новому стандарту она вообще уникальна. Хотя автор и новичок в написании книг, он уже успел отметиться в сообществе C++ хотя бы тем, что стал одним из авторов библиотеки boost.thread. Кроме того, он активно участвовал и участвует в разработке стандарта C++. Поэтому будем считать, что у него достаточно компетенции для написания подобной книги.

На мой взгляд книга написана довольно простым языком и имеет вполне сносную структуру, что позволяет читать книгу от начала и до конца, не прыгая из главы в главу. Книга начинается с небольшого исторического экскурса, плавно перетекая в представление потоков выполнения(threads), которые появились в C++11. За потоками следуют главы посвящённые примитивам синхронизации, такими как мьютексы и условные переменные. В главе 4 читателя знакомят с возможностями C++, в части асинхронного программирования. Все эти главы написаны довольно подробно и позволяют в полной мере проникнуться сутью всех этих нововведений. Кстати, особенно хочется отметить стиль, который автор использует для описания работы кода: это лучшее, из того, что я видел. Сложные места помечены указателями, которые в дальнейшем подробно разбираются в тексте.

Следуя за главами, которые описывают многопоточные примитивы, книга спускается на уровень ниже и в главе 5 описывает всё, что касается новой модели памяти, атомарных типов и барьеров памяти. Могу сказать, что на мой взгляд глава 5 написана весьма поверхностно, и не имеет той глубины, которую бы ей следовало придать. В следствии чего, на мой взгляд, после прочтения данной главы читатель не может понять всех этих завихрений с барьерами. Т.к. это весьма сложная тема, посвящать ей всего лишь одну главу было ошибкой. Для сравнения, вся 5-я глава, которая посвящена такой важной и сложной теме, меньше чем глава 4, которая посвящена примитивам, позволяющим соорудить в C++ некое подобие асинхронной модели. Тема 4-й главы ни в пример проще и меньше, темы из главы 5, поэтому для меня странно, что по объему они разнятся в другую сторону.

Окончив 5-ю главу книга заканчивает рассмотрение новшеств C++ и преступает к описанию того, как же применять всё то, что мы узнали из предыдущих глав. “In Action” в заголовке книги, как раз отражает все последующие главы. Из них вы узнаете, как проектировать структуры данных с разным уровнем возможного параллелизма, что такое блокирующие(lock-based) и неблокирующие(lock-free) структуры данных. Кроме того, вы познакомитесь с опасными указателями(hazard pointers) и другими алгоритмами, которые были созданы лишь потому, что в C++ нет сборщика мусора(garbage collector). Именно после прочтения этой книги я понял, зачем в C++11 добавили базовую поддержку сборщика мусора; раньше для меня это было ��то-то вроде мантры – “добавили потому, что это нужно для неблокирующих структур данных”. Прочтите данную книгу, и для вас так же станет очевидно – сборщик мусора в C++, пусть и не вездесущий, необходим. Все главы, которыю описывают применение ранее изученных примитивов рассматривают различные структуры данных и алгоритмы, что позволяет лучше понять, что и как можно применять на практике. На мой взгляд, эти главы являются наибольшим достоинством книги.

В последних главах книги автор делится опытом по тестированию и отлаживанию конкурентных алгоритмов. Естественно, по настоящему, подобные вещи можно постичь только практикой, и никакая теория тут не поможет. Тем не менее, какие-то советы могут оказаться полезными и вы возьмёте их на вооружение. Основные главы заканчиваются на 314 странице, тогда как в книге 506 страниц! А это значит, что чуть ли не половину книги занимают приложения.

Всего в книге 4 приложения. Первое приложение в весьма сжатой форме описывает нововведения в C++. Зачем это приложение в книге о многопоточности мне совершенно не ясно. Затем идёт глава, которая посвящена краткому(ОООЧЕНЬ краткому) сравнению библиотек по работе с многопоточностью. Причём, помимо boost.thread и стандартной библиотеки, тут присутствуют POSIX C и Java,- зачем? В следующем приложении идёт описание одной “библиотеки”, которая упоминается в тексте основных глав. Причём приведён её полный код(не очень много, но и не мало). Я так в курсовиках, в университете, делал, чтобы объем увеличить. Наконец, последним приложением является краткая справка по всем около-мультипоточным сущностям стандартной библиотеки. Этакая выжимка из стандарта, на целых 120(!) страниц книги, которая непонятно зачем здесь приведена – книга не подходит в качестве справочника!

Честно говоря, если основные главы, в целом, оставили у меня довольно приятное впечатление, то все приложения попросту бесполезны. Они здесь только для того, чтобы книга была толще и это видно не вооружённым взглядом. Поэтому из 506 страниц, нужных всего 314(я придираюсь, конечно, индекс таки тоже нужен :)). Из этого проистекает очень забавный момент, эта книга на 8 долларов дороже, чем уникальный труд Страуструпа! Она в 2 раза меньше по объему, если считать только по страницам, а по количеству материала они просто рядом не стояли, тем не менее имеем то, что имеем. Я надеюсь, что в следующем издании(если оно будет) автор всё же больше внимания уделит непосредственно материалу, а не тому, как можно напихать побольше страниц в книгу.

Подводя итог, я бы хотел сказать, что людям не знакомым с нововведениями в C++, в отношении многопоточности, эта книга будет интересна(хотя с этим может помочь и мой цикл статей - Добро пожаловать в параллельный мир). Кроме того, в книге описаны несколько интересных подходов к реализации конкурентных алгоритмов и структур данных, что тоже может быть интересно читателю. Поэтому, мой вердикт будет такой – если у вас есть возможность прочитать эту книгу бесплатно/недорого, я бы советовал всё же с ней ознакомится. Покупать её за 55$, на мой взгляд, не стоит. Но хочется предупредить тех, кто будет читать эту книгу скачанную из сети – в сети много её ранних вариантов и я не знаю есть ли финальный. Ранние версии изобилуют ошибками и могут ввести вас в весьма серьёзное заблуждение в некоторых местах, финальная версия этим не страдает.