#include #include #include int data_avail = 0; int data_item = 0; pthread_mutex_t data_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t data_cond = PTHREAD_COND_INITIALIZER; void *producer(void *arg) { int myrank = * (int *)arg; while (1) { pthread_mutex_lock(&data_mutex); // Produce data // Insert data into queue; data_avail =1; data_item ++; printf("Rank %d produced one item, total %d item(s).\n", myrank, data_item); pthread_cond_signal(&data_cond); pthread_mutex_unlock(&data_mutex); sleep (1); } } void *consumer(void *arg) { int myrank = * (int *)arg; while (1) { pthread_mutex_lock(&data_mutex); while( !data_avail ) { pthread_cond_wait(&data_cond, &data_mutex); } // Extract data from queue; data_item --; if (data_item == 0) data_avail = 0; printf("Rank %d consumed one item, total %d items\n", myrank, data_item); pthread_mutex_unlock(&data_mutex); sleep (1); // consume_data(); } } int tmp[5]; int main(int argc, char* argv[]){ pthread_t thread[5]; int i, j; for (j=0; j<2; j++) { tmp[j] = j; if ((i=pthread_create(&thread[j], NULL, producer, (void*)&tmp[j])) != 0) { printf("thread creation failed. %d\n", j); } } for (j=0; j<2; j++) { tmp[j] = j; if ((i=pthread_create(&thread[j+2], NULL, consumer, (void*)&tmp[j])) != 0) { printf("aathread creation failed. %d\n", j); } } pthread_join(thread[0], NULL); pthread_join(thread[1], NULL); pthread_join(thread[2], NULL); pthread_join(thread[3], NULL); printf("Exiting main\n"); return 0; }