0Pricing
C++ Academy · Урок

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;   // 1

join(): ожидание завершения

Вызовите 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 — локальная установка не требуется.

Все уроки этого курса

  1. std::thread: присоединение и отсоединение
  2. std::mutex, lock_guard и unique_lock
  3. Условные переменные и шаблоны рабочих потоков
  4. Основы std::async и std::future
← Назад к C++ Academy