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;
|
||
} |