Top.Mail.Ru
Ответы

Помогите решить задачу ! Симуляция работы кухни онлайн-ресторана

ребуется реализовать упрощённую модель работы кухни ресторана, работающего в режиме онлайн-доставки.

Онлайн-заказ поступает каждые 5–10 секунд. Это случайное блюдо из пяти: пицца, суп, стейк, салат, суши. Официант, принявший заказ онлайн, оставляет его у кухни. Если кухня свободна, она принимает заказ и спустя 5–15 секунд возвращает уже готовое блюдо на выдачу. Время определяется случайным образом с помощью функции std::rand() в указанных диапазонах.

Курьер приезжает каждые 30 секунд, забирает готовые блюда на выдаче и развозит их по заказчикам.

Программа завершается после 10 успешных доставок. На каждом из этапов, будь то заказ, или готовка, или доставка заказа, выводятся соответствующие сообщения в консоль.

Советы и рекомендации
Для симуляции готовки, используйте отдельный мьютекс и запускайте отдельную нить ожидания с вызовом detach для неё.

По дате
По рейтингу
Аватар пользователя
Мудрец
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
 #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; 
} 
 

Этот код симулирует работу кухни онлайн-ресторана с использованием мьютекса и отдельных потоков для готовки и доставки заказов. Вы можете использовать его как основу для своего решения.

Аватар пользователя
Ученик

Большое спасибо !!!

Аватар пользователя
Мастер

В ТЗ сказано, что готовка должна идти в отдельной детачнутой нити.



Видео по теме