Спящий парикмахер

156
22 апреля 2022, 10:10

Помогите разобраться как реализовать задачу "Спящий парикмахер", используя обмен сообщениями: Send и Recv. Разобрался, как реализовать через Семафоры и Мониторы, но с сообщениями не понимаю :(

Проблема спящего парикмахера - классическая задача паралельного программирования. Проблема заключается в обеспечении того, чтобы парикмахер работал, когда есть клиенты, и отдыхал, когда клиентов нет. У нас есть 1 парикмахер (Процесс 0) и остальные клиенты. Аналогия основана на гипотетической парикмахерской с одним парикмахером. У парикмахера есть одно рабочее место и приемная с несколькими стульями. Когда парикмахер заканчивает подстригать клиента, он отпускает клиента и затем идет в приёмную, чтобы посмотреть, есть ли там ожидающие клиенты. Если они есть, он приглашает одного из них и стрижет его. Если ждущих клиентов нет, он возвращается к своему креслу и спит в нем.

Main:

int size, rank;
std::queue<int> visitors;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0) {
    std::cout << "I am a barber [" << rank << "]" << std::endl;
    Barber(visitors);
}
    
if (rank != 0) {
    std::cout << "I'm not a barber [" << rank << "]" << std::endl;
    Client(visitors, chairs, rank);
}

Barber:

MPI_Status st;
MPI_Request request;
int num;
while (1) {
    if (visitors.size() == 0)
        continue;
    MPI_Recv(&num, 1, MPI_INT, visitors.front(), MPI_ANY_TAG, MPI_COMM_WORLD, &st);
    visitors.pop();
    std::cout << "I'm cutting process " << num << std::endl;
    std::cout << "There are " << visitors.size() << " people left in the queue" << std::endl;
}

Client:

void Client(std::queue<int>& visitors, int chairs, int rank) {
if (visitors.size() < chairs) {
    visitors.push(rank);
    MPI_Send(&rank, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
}
}
READ ALSO
Ошибка Thread 1: EXC_BAD_ACCESS (code=1, address=0x0) Xcode c++

Ошибка Thread 1: EXC_BAD_ACCESS (code=1, address=0x0) Xcode c++

Есть программа, ошибку выдает после прохождения функции mat1, при присваивании A[i] значение функции

133
Не работает простейший алгоритм

Не работает простейший алгоритм

Есть простейший алгоритм на c++, который заполняет и выводит двухмерный динамический массив числами от 1 до n*m, но не работает с некоторыми...

157
Как в конструкторе класса инициализировать поле класса, являющееся объектом и созданное на стеке?

Как в конструкторе класса инициализировать поле класса, являющееся объектом и созданное на стеке?

Как в конструкторе класса инициализировать поле класса, являющееся объектом класса и созданное на стеке? Следующий код вызывает ошибку

97
Алгоритм Флойда,вывод матрицы расстояний

Алгоритм Флойда,вывод матрицы расстояний

Реализовал алгоритм Флойда, но задался вопросом,как сделать помимо вывода матрицы кратчайших путей, ещё и вывод матрицы расстояний, который...

110