Помогите решить задачу ! Симуляция работы кухни онлайн-ресторана
ребуется реализовать упрощённую модель работы кухни ресторана, работающего в режиме онлайн-доставки.
Онлайн-заказ поступает каждые 5–10 секунд. Это случайное блюдо из пяти: пицца, суп, стейк, салат, суши. Официант, принявший заказ онлайн, оставляет его у кухни. Если кухня свободна, она принимает заказ и спустя 5–15 секунд возвращает уже готовое блюдо на выдачу. Время определяется случайным образом с помощью функции std::rand() в указанных диапазонах.
Курьер приезжает каждые 30 секунд, забирает готовые блюда на выдаче и развозит их по заказчикам.
Программа завершается после 10 успешных доставок. На каждом из этапов, будь то заказ, или готовка, или доставка заказа, выводятся соответствующие сообщения в консоль.
Советы и рекомендации
Для симуляции готовки, используйте отдельный мьютекс и запускайте отдельную нить ожидания с вызовом detach для неё.
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
#include <queue>
#include <string>
#include <cstdlib>
std::mutex kitchen_mutex;
std::queue<std::string> orders;
std::queue<std::string> ready_orders;
int delivered_orders = 0;
const std::string menu[5] = {"пицца", "суп", "стейк", "салат", "суши"};
void cook() {
while (delivered_orders < 10) {
std::unique_lock<std::mutex> lock(kitchen_mutex);
if (!orders.empty()) {
std::string order = orders.front();
orders.pop();
lock.unlock();
int cooking_time = rand() % 11 + 5;
std::this_thread::sleep_for(std::chrono::seconds(cooking_time));
lock.lock();
ready_orders.push(order);
std::cout << "Готово: " << order << std::endl;
}
}
}
void courier() {
while (delivered_orders < 10) {
std::unique_lock<std::mutex> lock(kitchen_mutex);
while (!ready_orders.empty()) {
std::string order = ready_orders.front();
ready_orders.pop();
delivered_orders++;
std::cout << "Доставлено: " << order << std::endl;
}
lock.unlock();
std::this_thread::sleep_for(std::chrono::seconds(30));
}
}
int main() {
srand(time(NULL));
std::thread cook_thread(cook);
std::thread courier_thread(courier);
while (delivered_orders < 10) {
int order_time = rand() % 6 + 5;
std::this_thread::sleep_for(std::chrono::seconds(order_time));
int dish = rand() % 5;
std::unique_lock<std::mutex> lock(kitchen_mutex);
orders.push(menu[dish]);
std::cout << "Заказано: " << menu[dish] << std::endl;
}
cook_thread.join();
courier_thread.join();
return 0;
}
Этот код симулирует работу кухни онлайн-ресторана с использованием мьютекса и отдельных потоков для готовки и доставки заказов. Вы можете использовать его как основу для своего решения.
Большое спасибо !!!
В ТЗ сказано, что готовка должна идти в отдельной детачнутой нити.