#include <stdio.h>
#include <mpi.h>
#include <stdlib.h>
#include <unistd.h>
#define SIZE 10 // dimensiunea cozii
int main(int argc, char *argv[]) {
int rank, size, i;
int queue[SIZE];
int qHead = 0, qTail = 0;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (size != 2) {
printf("Numarul de procese trebuie sa fie 2.\n"); MPI_Finalize();
return 1;
}
// Producator
if (rank == 0) {
for (i = 0; i < SIZE; i++) {
// Generam o valoare aleatorie pentru a adauga in coada
// Asteptam pana cand coada este plina
while ((qTail + 1) % SIZE == qHead);
// Adaugam elementul in coada
queue[qTail] = item;
qTail = (qTail + 1) % SIZE;
printf("Producatorul a adaugat elementul %d in coada.\n", item
); sleep(1);
}
}
// Consumator
else if (rank == 1) {
for (i = 0; i < SIZE; i++) {
// Asteptam pana cand coada este goala
while (qTail == qHead);
// Consumam elementul din coada
int item = queue[qHead];
qHead = (qHead + 1) % SIZE;
printf("Consumatorul a consumat elementul %d din coada.\n", item
); sleep(1);
}
}
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtcGkuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojZGVmaW5lIFNJWkUgMTAgLy8gZGltZW5zaXVuZWEgY296aWkKCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgIGludCByYW5rLCBzaXplLCBpOwogICAgaW50IHF1ZXVlW1NJWkVdOwogICAgaW50IHFIZWFkID0gMCwgcVRhaWwgPSAwOwoKICAgIE1QSV9Jbml0KCZhcmdjLCAmYXJndik7CiAgICBNUElfQ29tbV9yYW5rKE1QSV9DT01NX1dPUkxELCAmcmFuayk7CiAgICBNUElfQ29tbV9zaXplKE1QSV9DT01NX1dPUkxELCAmc2l6ZSk7CgogICAgaWYgKHNpemUgIT0gMikgewogICAgICAgIHByaW50ZigiTnVtYXJ1bCBkZSBwcm9jZXNlIHRyZWJ1aWUgc2EgZmllIDIuXG4iKTsKICAgICAgICBNUElfRmluYWxpemUoKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAvLyBQcm9kdWNhdG9yCiAgICBpZiAocmFuayA9PSAwKSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IFNJWkU7IGkrKykgewogICAgICAgICAgICAvLyBHZW5lcmFtIG8gdmFsb2FyZSBhbGVhdG9yaWUgcGVudHJ1IGEgYWRhdWdhIGluIGNvYWRhCiAgICAgICAgICAgIGludCBpdGVtID0gcmFuZCgpICUgMTAwOwoKICAgICAgICAgICAgLy8gQXN0ZXB0YW0gcGFuYSBjYW5kIGNvYWRhIGVzdGUgcGxpbmEKICAgICAgICAgICAgd2hpbGUgKChxVGFpbCArIDEpICUgU0laRSA9PSBxSGVhZCk7CiAgICAgICAgICAgIC8vIEFkYXVnYW0gZWxlbWVudHVsIGluIGNvYWRhCiAgICAgICAgICAgIHF1ZXVlW3FUYWlsXSA9IGl0ZW07CiAgICAgICAgICAgIHFUYWlsID0gKHFUYWlsICsgMSkgJSBTSVpFOwogICAgICAgICAgICBwcmludGYoIlByb2R1Y2F0b3J1bCBhIGFkYXVnYXQgZWxlbWVudHVsICVkIGluIGNvYWRhLlxuIiwgaXRlbSk7CiAgICAgICAgICAgIHNsZWVwKDEpOwogICAgICAgIH0KICAgIH0KICAgIC8vIENvbnN1bWF0b3IKICAgIGVsc2UgaWYgKHJhbmsgPT0gMSkgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBTSVpFOyBpKyspIHsKICAgICAgICAgICAgLy8gQXN0ZXB0YW0gcGFuYSBjYW5kIGNvYWRhIGVzdGUgZ29hbGEKICAgICAgICAgICAgd2hpbGUgKHFUYWlsID09IHFIZWFkKTsKICAgICAgICAgICAgLy8gQ29uc3VtYW0gZWxlbWVudHVsIGRpbiBjb2FkYQogICAgICAgICAgICBpbnQgaXRlbSA9IHF1ZXVlW3FIZWFkXTsKICAgICAgICAgICAgcUhlYWQgPSAocUhlYWQgKyAxKSAlIFNJWkU7CiAgICAgICAgICAgIHByaW50ZigiQ29uc3VtYXRvcnVsIGEgY29uc3VtYXQgZWxlbWVudHVsICVkIGRpbiBjb2FkYS5cbiIsIGl0ZW0pOwogICAgICAgICAgICBzbGVlcCgxKTsKICAgICAgICB9CiAgICB9CgogICAgTVBJX0ZpbmFsaXplKCk7CgogICAgcmV0dXJuIDA7Cn0K