/** * Оригинальный код: https://stackoverflow.com/a/61960363 */ #include #include #include #include // (1) Переменная должна быть атомарной, чтобы избежать состояния гонки std::atomic app_finished{false}; using namespace std::literals::chrono_literals; void SendData(int id) { std::cout << "Рабочий поток: " << id << std::endl; std::cout << "Идентификатор потока: " << std::this_thread::get_id() << std::endl; while (!app_finished) { std::cout << "Работа..." << std::endl; std::this_thread::sleep_for(1s); } } std::thread startRecording(std::optional t) { std::thread th1(SendData, 1); std::cout << "[startRecording] Другая задача" << std::endl; // (2) Возвращаем поток, чтобы присоединиться к нему в main() return th1; } void stopRecording() { app_finished = true; std::cout << "[stopRecording] Другая задача" << std::endl; } int main() { std::cout << "Запуска программы..." << std::endl; // (3) Сохраняем поток в переменной с именем "worker" // что можно было присоединиться к нему позже. std::thread worker = startRecording(std::optional{1}); std::this_thread::sleep_for(5s); stopRecording(); // (4) Присоединяемся к потоку здесь, в конце worker.join(); return EXIT_SUCCESS; }