Какие способы создания потока в стандартной библиотеке C++ ты знаешь?

«Какие способы создания потока в стандартной библиотеке C++ ты знаешь?» — вопрос из категории Многопоточность, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В C++, начиная со стандарта C++11, создание потоков осуществляется через класс std::thread из заголовка <thread>. Основные способы:

  1. Передача функции (free function):

    void thread_function(int param) { /* ... */ }
    std::thread t1(thread_function, 42);
  2. Передача лямбда-выражения:

    std::thread t2([](const std::string& msg) {
        std::cout << msg << std::endl;
    }, "Hello from thread");
  3. Передача функционального объекта (functor):

    struct Task {
        void operator()() const { /* ... */ }
    };
    std::thread t3(Task{});
  4. Передача метода класса:

    class Worker {
    public:
        void process() { /* ... */ }
    };
    Worker w;
    std::thread t4(&Worker::process, &w); // Указатель на метод и объект

Критически важные моменты:

  • Поток начинает выполнение немедленно после создания объекта std::thread.
  • Необходимо явно присоединить (join()) или отсоединить (detach()) поток до разрушения объекта std::thread, иначе будет вызван std::terminate.
  • Аргументы передаются в функцию потока по значению. Для передачи по ссылке нужно использовать std::ref или std::cref.
    void modify(int& ref) { ref = 100; }
    int value = 0;
    std::thread t5(modify, std::ref(value)); // Передача по ссылке
    t5.join();
    std::cout << value; // Выведет 100