Какой опыт многопоточности и какие библиотеки использовались в C++
Что проверяют
За списком заголовков интервьюер ищет понимание модели памяти и реальный опыт отладки гонок. Следом обычно просят рассказать, как вы искали дедлок или гонку данных, и чем std::atomic отличается от мьютекса.
Как отвечать
Начните со своей задачи: что распараллеливали и зачем (обработка данных, сетевые запросы, фоновая загрузка в GUI), сколько потоков, какой прирост измерили. Потом назовите инструменты с версией стандарта:
- потоки:
std::thread(C++11) иstd::jthread(C++20), который сам запрашивает остановку черезstd::stop_tokenи делаетjoinв деструкторе. Уничтожениеstd::threadбезjoinилиdetachвызываетstd::terminate; - блокировки:
std::mutexсstd::lock_guardилиstd::unique_lock,std::scoped_lock(C++17) для захвата нескольких мьютексов без дедлока,std::shared_mutexдля схемы «много читателей, один писатель»; - ожидание:
std::condition_variableвсегда с предикатом вwait, потому что бывают ложные пробуждения. В C++20 добавилисьstd::latch,std::barrier,std::counting_semaphore; - атомики:
std::atomicи порядок памяти, отmemory_order_seq_cstпо умолчанию доmemory_order_relaxedдля счётчиков; - задачи:
std::asyncиstd::future. Без явногоstd::launch::asyncреализация вправе отложить выполнение до вызоваget().
Из сторонних библиотек называйте только то, с чем работали: Boost.Asio для асинхронной сети, oneTBB для пулов задач и параллельных алгоритмов, OpenMP для вычислительных циклов, QThread и QtConcurrent в Qt. Скажите и про диагностику: ThreadSanitizer (-fsanitize=thread в GCC и Clang), Helgrind из Valgrind, perf. Если промышленного опыта мало, опишите свой учебный пул потоков и что вы на нём поймали.
Где спотыкаются
Используют volatile для синхронизации. В C++ он не даёт ни атомарности, ни упорядочивания, в отличие от Java.
Держат мьютекс слишком долго, например вокруг вывода в std::cout или сетевого вызова, и многопоточная версия работает медленнее однопоточной.
Не знают про ложное разделение кэш-линий: два атомарных счётчика рядом в памяти, обновляемые из разных потоков, мешают друг другу, хотя логически независимы.