#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
int main(int argc, char **argv) {
MPI_Init(&argc, &argv);
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
int BUFFER_SIZE = 10;
int buffer[BUFFER_SIZE];
int in = 0, out = 0;
int item;
MPI_Status status;
if (rank == 0) { // Producer process
for (int i = 0; i < 100; i++) {
while ((in + 1) % BUFFER_SIZE == out) ; // Wait while buffer is full
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
printf("Producer produced item %d ", item);
MPI_Send(&item, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
}
} else if (rank == 1) { // Consumer process
for (int i = 0; i < 100; i++) {
while (in == out) ; // Wait while buffer is empty
MPI_Recv(&item, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
printf("Consumer consumed item %d ", item);
}
}
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1waS5oPgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICBNUElfSW5pdCgmYXJnYywgJmFyZ3YpOwogICAgaW50IHJhbmssIHNpemU7CiAgICBNUElfQ29tbV9yYW5rKE1QSV9DT01NX1dPUkxELCAmcmFuayk7CiAgICBNUElfQ29tbV9zaXplKE1QSV9DT01NX1dPUkxELCAmc2l6ZSk7CiAgICAKICAgIGludCBCVUZGRVJfU0laRSA9IDEwOwogICAgaW50IGJ1ZmZlcltCVUZGRVJfU0laRV07CiAgICBpbnQgaW4gPSAwLCBvdXQgPSAwOwogICAgaW50IGl0ZW07CiAgICBNUElfU3RhdHVzIHN0YXR1czsKICAgIAogICAgaWYgKHJhbmsgPT0gMCkgeyAvLyBQcm9kdWNlciBwcm9jZXNzCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgewogICAgICAgICAgICBpdGVtID0gcmFuZCgpICUgMTAwOwogICAgICAgICAgICB3aGlsZSAoKGluICsgMSkgJSBCVUZGRVJfU0laRSA9PSBvdXQpIDsgLy8gV2FpdCB3aGlsZSBidWZmZXIgaXMgZnVsbAogICAgICAgICAgICBidWZmZXJbaW5dID0gaXRlbTsKICAgICAgICAgICAgaW4gPSAoaW4gKyAxKSAlIEJVRkZFUl9TSVpFOwogICAgICAgICAgICBwcmludGYoIlByb2R1Y2VyIHByb2R1Y2VkIGl0ZW0gJWQKIiwgaXRlbSk7CiAgICAgICAgICAgIE1QSV9TZW5kKCZpdGVtLCAxLCBNUElfSU5ULCAxLCAwLCBNUElfQ09NTV9XT1JMRCk7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChyYW5rID09IDEpIHsgLy8gQ29uc3VtZXIgcHJvY2VzcwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKICAgICAgICAgICAgd2hpbGUgKGluID09IG91dCkgOyAvLyBXYWl0IHdoaWxlIGJ1ZmZlciBpcyBlbXB0eQogICAgICAgICAgICBNUElfUmVjdigmaXRlbSwgMSwgTVBJX0lOVCwgMCwgMCwgTVBJX0NPTU1fV09STEQsICZzdGF0dXMpOwogICAgICAgICAgICBwcmludGYoIkNvbnN1bWVyIGNvbnN1bWVkIGl0ZW0gJWQKIiwgaXRlbSk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBNUElfRmluYWxpemUoKTsKICAgIHJldHVybiAwOwp9Cg==