/* ----------------------------------------------------------------- */ /* PROGRAM buffer : */ /* This is the bounded buffer problem */ /* ----------------------------------------------------------------- */ #include #include #include "mtuThread.h" /* ----------------------------------------------------------------- */ /* Function Prototypes */ /* ----------------------------------------------------------------- */ void Producer(int); void Consumer(int); /* ----------------------------------------------------------------- */ /* Mailbox */ /* ----------------------------------------------------------------- */ MBOX_t Box; /* ----------------------------------------------------------------- */ /* FUNCTION Producer: */ /* Function Producer keeps sending data to a mailbox. */ /* ----------------------------------------------------------------- */ void Producer(int ID) { int i, data; for (i = 0; ; i++) { data = ID*1000 + i; MSG_SEND(Box, data); printf("Producer %d has sent data %d\n", ID, data); } THREAD_EXIT(); } /* ----------------------------------------------------------------- */ /* FUNCTION Consumer: */ /* Function Consumer keeps receiving mail from the mailbox. */ /* ----------------------------------------------------------------- */ void Consumer(int ID) { int mail; while (1) { MSG_RECEIVE(Box, &mail); printf(" Consumer %d received %d\n", ID, mail); } THREAD_EXIT(); } /* ----------------------------------------------------------------- */ /* The main program starts here */ /* ----------------------------------------------------------------- */ int main(int argc, char *argv[]) { THREAD_t Producer1, Producer2, Consumer1, Consumer2; int i; char ch; printf("Use Ctrl-C to kill this program\n"); printf("Hit any key to continue... "); ch = getchar(); printf("\n"); Box = MSG_INIT(); /* create mailbox */ Producer1 = THREAD_CREATE(Producer, THREAD_SIZE, THREAD_NORMAL, 1, (char **) 0); Producer2 = THREAD_CREATE(Producer, THREAD_SIZE, THREAD_NORMAL, 2, (char **) 0); Consumer1 = THREAD_CREATE(Consumer, THREAD_SIZE, THREAD_NORMAL, 1, (char **) 0); Consumer2 = THREAD_CREATE(Consumer, THREAD_SIZE, THREAD_NORMAL, 2, (char **) 0); THREAD_JOIN(Producer1); return 0; }