snipplets.dev/code/C++/thread/thread.cpp

54 lines
1.5 KiB
C++
Raw Normal View History

2024-06-18 21:50:38 +03:00
/**
* Оригинальный код: 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;
}