Ответ
В C++, начиная со стандарта C++11, создание потоков осуществляется через класс std::thread из заголовка <thread>. Основные способы:
-
Передача функции (free function):
void thread_function(int param) { /* ... */ } std::thread t1(thread_function, 42); -
Передача лямбда-выражения:
std::thread t2([](const std::string& msg) { std::cout << msg << std::endl; }, "Hello from thread"); -
Передача функционального объекта (functor):
struct Task { void operator()() const { /* ... */ } }; std::thread t3(Task{}); -
Передача метода класса:
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