/* ================================================================= Reader/writer ================================================================= */ #include #include #include #include #define NIter 1000 #define MAX 10 int nItems = 0; // Number of items in buffer int buf[MAX]; int writePtr = 0, readPtr = 0; sema_t writerSem, readerSem; void *writerProc(void *arg) { int i, x, sum; sum = 0; for ( i = 0; i < NIter; i++ ) { x = rand()%100; // Produce an item sum += x; sema_wait(&writerSem); cout << "+"; buf[writePtr] = x; // Put x in buffer writePtr = (writePtr+1) % MAX; sema_post(&readerSem); } cout << "Writer: sum = " << sum << "\n\n"; return NULL; } void *readerProc(void *arg) { int i, x, sum; sum = 0; for ( i = 0; i < NIter; i++ ) { sema_wait(&readerSem); cout << "-"; x = buf[readPtr]; // get x from buffer sum += x; readPtr = (readPtr+1) % MAX; sema_post(&writerSem); } cout << "Reader: sum = " << sum << "\n\n"; return NULL; } /* ======================= MAIN ======================= */ int main(int argc, char *argv[]) { int i, num_threads; pthread_t tid[2]; /* Thread ID used for thread_join() */ /* ========================= Initialize semaphore ========================= */ // sema_init( &writerSem, 1, NULL, NULL ); /* Interesting experiment */ sema_init( &writerSem, MAX, NULL, NULL ); sema_init( &readerSem, 0, NULL, NULL ); /* ------ Create threads ------ */ if ( pthread_create(&tid[0], NULL, readerProc, NULL) ) { cout << "Cannot create READER thread" << endl; exit(1); } if ( pthread_create(&tid[0], NULL, writerProc, NULL) ) { cout << "Cannot create WRITER thread" << endl; exit(1); } cout << "Main thread is waiting...." << endl; for (i = 0; i < 2; i = i + 1) pthread_join(tid[i], NULL); cout << "Main thread is DONE...." << endl; }