From dd1c195da54d99ed2c1789a30f7f3989bc023b82 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Tue, 18 Jun 2024 21:50:38 +0300 Subject: [PATCH] c++: thread example --- code/C++/thread/Makefile | 5 ++++ code/C++/thread/thread.cpp | 54 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 code/C++/thread/Makefile create mode 100644 code/C++/thread/thread.cpp diff --git a/code/C++/thread/Makefile b/code/C++/thread/Makefile new file mode 100644 index 0000000..28698ba --- /dev/null +++ b/code/C++/thread/Makefile @@ -0,0 +1,5 @@ +# CC=g++ # Small output file +CC=clang++-18 # Big output file + +all: + $(CC) -O3 -o app thread.cpp diff --git a/code/C++/thread/thread.cpp b/code/C++/thread/thread.cpp new file mode 100644 index 0000000..1001200 --- /dev/null +++ b/code/C++/thread/thread.cpp @@ -0,0 +1,54 @@ +/** + * Оригинальный код: https://stackoverflow.com/a/61960363 + */ + +#include +#include +#include +#include + +// (1) Переменная должна быть атомарной, чтобы избежать состояния гонки +std::atomic 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 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{1}); + + std::this_thread::sleep_for(5s); + + stopRecording(); + + // (4) Присоединяемся к потоку здесь, в конце + worker.join(); + + return EXIT_SUCCESS; +} \ No newline at end of file