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

54 lines
1.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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