Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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;
}