/
nanezz
/
mutex1
Обзор
Документация
Войти
/
nanezz
/
mutex1
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
mutex1.cpp
101 строка
3 KB
nanezz
Create: mutex1.slnx, mutex1.cpp
03 июл 2026, 23:19
Верифицирован
03 июл 2026, 23:19
2343302
Код
Авторство
О чём код?
#include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <chrono> #include <atomic> #include <cstdlib> #ifdef _WIN32 #include <Windows.h> #endif struct SharedData { std::atomic<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)); int newVal = data.clients.fetch_add(1, std::memory_order_release) + 1; std::cout << "[Генератор] Добавлен клиент. Всего: " << newVal << "\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); data.cv.wait(lock, [&data]() { return data.clients.load(std::memory_order_acquire) > 0 || data.finishedAdding; }); if (data.clients.load(std::memory_order_acquire) == 0 && data.finishedAdding) { std::cout << "[Операционист] Клиентов нет, завершаю работу.\n"; break; } if (data.clients.load(std::memory_order_acquire) > 0) { int remaining = data.clients.fetch_sub(1, std::memory_order_release) - 1; std::cout << "[Операционист] Обслужен клиент. Осталось: " << remaining << "\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; }