/
nanezz
/
thread_1
Обзор
Документация
Войти
/
nanezz
/
thread_1
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
thread1.cpp
115 строк
3 KB
nanezz
Create: thread1.cpp, thread1.slnx
02 июл 2026, 03:41
Верифицирован
02 июл 2026, 03:41
b3ab5bf
Код
Авторство
О чём код?
#include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <chrono> #include <atomic> #include <cstdlib> #ifdef _WIN32 #include <Windows.h> #endif struct SharedData { int clients; bool finishedAdding; std::mutex mtx; std::condition_variable cv; }; void clientGenerator(SharedData& data, int maxClients) { for (int i = 0; i < maxClients; ++i) { std::this_thread::sleep_for(std::chrono::seconds(1)); { std::lock_guard<std::mutex> lock(data.mtx); ++data.clients; std::cout << "[Генератор] Добавлен клиент. Всего: " << data.clients << "\n"; } data.cv.notify_one(); } { std::lock_guard<std::mutex> lock(data.mtx); data.finishedAdding = true; std::cout << "[Генератор] Добавление клиентов завершено.\n"; } data.cv.notify_all(); } void operatorThread(SharedData& data) { while (true) { std::unique_lock<std::mutex> lock(data.mtx); if (data.clients == 0 && data.finishedAdding) { std::cout << "[Операционист] Клиентов нет, завершаю работу.\n"; break; } if (data.clients == 0) { std::cout << "[Операционист] Очередь пуста, жду...\n"; data.cv.wait(lock, [&data]() { return data.clients > 0 || data.finishedAdding; }); if (data.clients == 0 && data.finishedAdding) { std::cout << "[Операционист] Клиентов нет, завершаю работу.\n"; break; } } if (data.clients > 0) { --data.clients; std::cout << "[Операционист] Обслужен клиент. Осталось: " << data.clients << "\n"; lock.unlock(); std::this_thread::sleep_for(std::chrono::seconds(2)); } else { lock.unlock(); std::this_thread::sleep_for(std::chrono::milliseconds(100)); } } } int main(int argc, char* argv[]) { #ifdef _WIN32 SetConsoleCP(1251); SetConsoleOutputCP(1251); #endif int maxClients = 10; if (argc > 1) { maxClients = std::atoi(argv[1]); if (maxClients <= 0) { std::cerr << "Количество клиентов должно быть положительным.\n"; return 1; } } SharedData data; data.clients = 0; data.finishedAdding = false; std::cout << "Запуск программы с максимумом клиентов: " << maxClients << "\n"; std::thread generator(clientGenerator, std::ref(data), maxClients); std::thread operatorWorker(operatorThread, std::ref(data)); generator.join(); operatorWorker.join(); std::cout << "Программа завершена.\n"; return 0; }