std::thread: присоединение и отсоединение
Создавайте потоки с помощью std::thread и выбирайте между присоединением и отсоединением.
«std::thread: присоединение и отсоединение» — бесплатный урок C++ Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Класс std::thread
Заголовок <thread> добавил поддержку потоков в стандартную библиотеку в C++11. Каждый экземпляр std::thread представляет один поток OS.
Создание потока
Передайте вызываемый объект (функцию, лямбду или функтор) конструктору. Поток начнёт выполняться немедленно.
#include <thread>
#include <iostream>
void worker() { std::cout << "running on thread\n"; }
int main() {
std::thread t(worker);
t.join(); // wait for it to finish
}Передача аргументов
Передавайте аргументы вызываемому объекту через конструктор.
std::thread t([](int n) { std::cout << n; }, 42);
t.join();Передача по ссылке
Используйте std::ref, чтобы передать аргументы по ссылке. Без этого поток получит копии.
int counter = 0;
std::thread t([](int& c) { ++c; }, std::ref(counter));
t.join();
std::cout << counter; // 1join(): ожидание завершения
Вызовите join(), чтобы заблокировать вызывающий поток до завершения целевого. После join поток больше нельзя присоединить.
detach(): независимое выполнение
Вызовите detach(), чтобы запустить поток независимо. Он продолжит выполнение после уничтожения объекта std::thread. Ресурсы освобождаются OS при завершении потока.
std::thread t([]() { /* background work */ });
t.detach(); // we no longer track itВозможность присоединения
Проверьте, можно ли присоединить или отделить поток. Поток, который уже присоединили или отделили, больше нельзя присоединить.
Забыли присоединить: завершение
Если объект std::thread уничтожается, пока его ещё можно присоединить, программа вызывает std::terminate. Всегда вызывайте join или detach до уничтожения.
Обёртка RAII
Напишите небольшую обёртку RAII, которая выполняет join в деструкторе. Или используйте std::jthread (C++20) — он присоединяется автоматически.
#include <thread>
// C++20
std::jthread t([] { /* work */ });
// t joins automatically when destroyedАппаратный параллелизм
Получите количество аппаратных потоков с помощью std::thread::hardware_concurrency(). Используйте его для определения размера пулов потоков.
Идентификаторы потоков
У каждого потока есть уникальный идентификатор. Получите идентификатор текущего потока с помощью std::this_thread::get_id().
Приостановка потока
Используйте std::this_thread::sleep_for(duration), чтобы приостановить текущий поток.
#include <chrono>
using namespace std::chrono_literals;
std::this_thread::sleep_for(500ms);Быстрая проверка
Что произойдёт, если объект std::thread, который можно присоединить, будет уничтожен до вызова join() или detach()?
Итоги
Создавайте потоки с помощью std::thread и вызываемого объекта. Всегда вызывайте join() или detach() до уничтожения объекта потока либо используйте std::jthread (C++20), который присоединяется автоматически.
Часто задаваемые вопросы
Урок «std::thread: присоединение и отсоединение» бесплатный?
Да — полный текст урока «std::thread: присоединение и отсоединение» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «std::thread: присоединение и отсоединение»?
Создавайте потоки с помощью std::thread и выбирайте между присоединением и отсоединением. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «std::thread: присоединение и отсоединение»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- std::thread: присоединение и отсоединение
- std::mutex, lock_guard и unique_lock
- Условные переменные и шаблоны рабочих потоков
- Основы std::async и std::future