54 lines
1.5 KiB
C++
54 lines
1.5 KiB
C++
|
/**
|
|||
|
* Оригинальный код: 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;
|
|||
|
}
|