c++: thread example
This commit is contained in:
parent
26acd92cee
commit
dd1c195da5
5
code/C++/thread/Makefile
Normal file
5
code/C++/thread/Makefile
Normal file
@ -0,0 +1,5 @@
|
||||
# CC=g++ # Small output file
|
||||
CC=clang++-18 # Big output file
|
||||
|
||||
all:
|
||||
$(CC) -O3 -o app thread.cpp
|
54
code/C++/thread/thread.cpp
Normal file
54
code/C++/thread/thread.cpp
Normal 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user