int main () { Stream prod, cons1, cons2, asker1; Args prod_args, cons1_args, cons2_args, asker_args; pthread_attr_t attr; // initialize the streams init_stream(&prod_args, &p1, &prod, NULL); init_stream(&cons1_args, &c1, &cons1, NULL); init_stream(&cons2_args, &c2, &cons2, NULL); init_stream(&asker_args, &a1, &asker1, NULL); // attach the consumers to the producer connect(&cons1_args, &prod); connect(&cons2_args, &prod); // attach the asker to the consumers connect(&asker_args, &cons1); connect(&asker_args, &cons2); // set up / create threads pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_create(&p1, &attr, producer, (void*)&prod_args); //pthread_create(&c1, &attr, consumer, (void*)&cons1_args); //pthread_create(&c2, &attr, consumer, (void*)&cons2_args); pthread_create(&a1, &attr, asker, (void*)&asker_args); // cancel the threads upon completion pthread_join(a1, NULL); kill_stream(&prod); kill_stream(&cons1); kill_stream(&cons2); kill_stream(&asker1); }
int main () { pthread_t s1, s2, t1, t2, m1, c1; Stream suc1, suc2, tms1, tms2, mrg; Args suc1_args, suc2_args, tms1_args, tms2_args, mrg_args, cons_args; pthread_attr_t attr; init_stream(&suc1_args, &suc1, NULL); /* initialize a successor stream */ init_stream(&suc2_args, &suc2, NULL); /* initialize a successor stream */ init_stream(&tms1_args, &tms1, (void*)7); /* initialize a times 7 stream */ connect(&tms1_args, &suc1); /* connect to a successor */ init_stream(&tms2_args, &tms2, (void*)5); /* initialize a times 5 stream */ connect(&tms2_args, &suc2); /* connect to a successor */ init_stream(&mrg_args, &mrg, NULL); /* initialize a merge stream */ connect(&mrg_args, &tms1); /* connect to a times stream */ connect(&mrg_args, &tms2); /* connect to a 2nd times stream */ init_stream(&cons_args, NULL, NULL); /* initialize a consumer stream */ connect(&cons_args, &mrg); /* connect to a merge stream */ pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_create(&s1, &attr, successor, (void*)&suc1_args); pthread_create(&s2, &attr, successor, (void*)&suc2_args); pthread_create(&t1, &attr, times, (void*)&tms1_args); pthread_create(&t2, &attr, times, (void*)&tms2_args); pthread_create(&m1, &attr, merge, (void*)&mrg_args); pthread_create(&c1, &attr, consumer, (void*)&cons_args); pthread_join(c1, NULL); /* cancel all running threads when the */ /* is finished consuming */ pthread_cancel(s1); pthread_cancel(s2); pthread_cancel(t1); pthread_cancel(t2); pthread_cancel(m1); kill_stream(&suc1); kill_stream(&suc2); kill_stream(&tms1); kill_stream(&tms2); kill_stream(&mrg); pthread_exit(NULL); }
int main(void) { printf("01\t--------------------------------------------\n"); printf("02\t1 successor, 2 non threaded consumers\n"); printf("03\tConsumer 2 disconnects, consumer 1 continues\n"); printf("04\tgetting token, consumer 2 reconnects\n"); printf("03\t--------------------------------------------\n"); int con_delay = 0; int suc_delay = 0; pthread_t s1; stream_t suc1; stream_t cons1; stream_t cons2; init_stream(&suc1, &suc_delay); init_stream(&cons1, NULL); init_stream(&cons2, NULL); stream_connect(&cons1, &suc1); stream_connect(&cons2, &suc1); pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_create(&s1, &attr, suc, (void*)&suc1); printf("Both consumers connected\n"); sleep(con_delay); printf("Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf("Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf("Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf("Consumer 2 got: %d\n", *(int*)consume_single((void*)&cons2)); //print_buffers(&cons2); sleep(con_delay); printf("Consumer 2 got: %d\n", *(int*)consume_single((void*)&cons2)); //print_buffers(&cons2); sleep(con_delay); printf("Consumer 2 got: %d\n", *(int*)consume_single((void*)&cons2)); //print_buffers(&cons2); printf("Disconnecting consumer 2\n"); sleep(con_delay); stream_disconnect(&cons2, &suc1); sleep(con_delay); printf(" Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf(" Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf(" Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf(" Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf(" Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf(" Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf(" Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf(" Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); printf("Reconnecting consumer 2\n"); sleep(con_delay); stream_connect(&cons2, &suc1); sleep(con_delay); printf("Consumer 2 got: %d\n", *(int*)consume_single((void*)&cons2)); //print_buffers(&cons2); sleep(con_delay); printf("Consumer 2 got: %d\n", *(int*)consume_single((void*)&cons2)); //print_buffers(&cons2); sleep(con_delay); printf("Consumer 2 got: %d\n", *(int*)consume_single((void*)&cons2)); //print_buffers(&cons2); sleep(con_delay); printf("Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf("Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf("Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf("Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf("Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); printf("Disconnecting consumer 1\n"); sleep(con_delay); stream_disconnect(&cons1, &suc1); sleep(con_delay); printf("Consumer 2 got: %d\n", *(int*)consume_single((void*)&cons2)); //print_buffers(&cons2); sleep(con_delay); printf("Consumer 2 got: %d\n", *(int*)consume_single((void*)&cons2)); //print_buffers(&cons2); sleep(con_delay); printf("Consumer 2 got: %d\n", *(int*)consume_single((void*)&cons2)); //print_buffers(&cons2); printf("Reconnecting consumer 1\n"); sleep(con_delay); stream_connect(&cons1, &suc1); sleep(con_delay); printf("Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf("Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf("Consumer 1 got: %d\n", *(int*)consume_single((void*)&cons1)); //print_buffers(&cons1); sleep(con_delay); printf("done\n"); pthread_cancel(s1); kill_stream(&suc1); return 0; }