#include <stdio.h>
#include <unistd.h>

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

int main(int argc, char* argv[]) {
    #ifdef _OPENMP
        
        double start_time = omp_get_wtime();
        #pragma omp parallel num_threads(3)
        {
	    /* Only one thread creates all the tasks */
            #pragma omp single nowait 
            {
            #pragma omp task
            sleep(1);

            printf("After launch of task1\n");

            #pragma omp task
            sleep(2);

            printf("After launch of task2\n");

            #pragma omp task
            sleep(1);

            printf("After launch of task3\n");

            double end_time = omp_get_wtime();
            printf("time to launch all tasks: %g\n", end_time - start_time);

            #pragma omp taskwait
            end_time = omp_get_wtime();
            printf("time to finish all task: %g\n", end_time - start_time);
            }
        }

/*

After launch of task1
After launch of task2
After launch of task3
time to launch all tasks: 7.0396e-05
time to finish all task: 2.00029

*/

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

    return 0;
}