/**
 * Оригинальный код: https://stackoverflow.com/a/61960363
 */

#include <iostream>
#include <thread>
#include <optional>
#include <atomic>

// (1) Переменная должна быть атомарной, чтобы избежать состояния гонки
std::atomic<bool> 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<int> 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<int>{1});

  std::this_thread::sleep_for(5s);

  stopRecording();

  // (4) Присоединяемся к потоку здесь, в конце
  worker.join();

  return EXIT_SUCCESS;
}