c++: thread example

This commit is contained in:
Alexander Popov 2024-06-18 21:50:38 +03:00
parent 26acd92cee
commit dd1c195da5
2 changed files with 59 additions and 0 deletions

5
code/C++/thread/Makefile Normal file
View File

@ -0,0 +1,5 @@
# CC=g++ # Small output file
CC=clang++-18 # Big output file
all:
$(CC) -O3 -o app thread.cpp

View File

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