#include <stdio.h>

#ifdef _OPENMP
    #include <omp.h>
#endif

void print_omp_info(const char text[]) {
    #pragma omp critical
    printf("%i/%i%s\n", omp_get_thread_num(), omp_get_num_threads(), text);
}

int main(int argc, char *argv[]) {
    #ifdef _OPENMP
        #pragma omp parallel
        {
            print_omp_info(" in parallel region");

            /* Implicite barrier after single region */
            #pragma omp single
            print_omp_info( " in parallel region with single");

            /* No implicite barrier for master region */
            #pragma omp master
            print_omp_info( " in parallel region with master");

            print_omp_info(" in parallel region");

            #pragma omp barrier
            #pragma omp single
            print_omp_info( " in parallel region with single after barrier");
        }
/*

0/4 in parallel region
3/4 in parallel region
0/4 in parallel region with single
1/4 in parallel region
2/4 in parallel region
1/4 in parallel region
0/4 in parallel region with master
0/4 in parallel region
3/4 in parallel region
2/4 in parallel region
1/4 in parallel region with single after barrier

*/

    #else
        printf("No OpenMP support\n");
    #endif

    return 0;
}