Что такое поток
Что проверяют
Различаете ли вы поток и процесс и понимаете ли цену многопоточности именно в C++, где гонка данных это неопределённое поведение, а не просто неверное число в отчёте.
Как отвечать
Поток это отдельная последовательность исполнения внутри процесса: свой стек и свои регистры, но общая куча, общие статические данные и общая таблица дескрипторов. Отсюда и дешёвое создание по сравнению с процессом, и все проблемы: любая разделяемая переменная без синхронизации это гонка.
В стандартной библиотеке поток запускается конструктором std::thread, и его обязательно нужно присоединить через join или отсоединить через detach до разрушения объекта, иначе деструктор зовёт std::terminate. В современных версиях языка есть std::jthread, который присоединяется сам и умеет принимать сигнал остановки.
std::mutex m;
long counter = 0;
void worker(int n) {
for (int i = 0; i < n; ++i) {
std::lock_guard<std::mutex> lock(m);
++counter;
}
}Инструменты синхронизации: мьютекс под lock_guard или unique_lock, std::atomic для счётчиков и флагов, std::condition_variable для ожидания события, std::async и std::future, когда нужен результат, а не сам поток.
Полезно упомянуть модель памяти: без атомарных операций и блокировок компилятор и процессор вправе переставлять обращения к памяти, поэтому «у меня работает» ничего не доказывает.
Где спотыкаются
Обещают ускорение от любого числа потоков. Выигрыш ограничен долей кода, которую вообще можно распараллелить, а лишние потоки добавляют переключений контекста и борьбы за кэш.
Передают в поток ссылку на локальную переменную или захватывают её по ссылке в лямбде, а вызывающая функция успевает завершиться раньше. Данные надо копировать или продлевать им жизнь осознанно.
Берут два мьютекса в разном порядке в разных функциях и получают взаимную блокировку. Лечится единым порядком захвата или захватом обоих сразу через std::scoped_lock.