#include <cstdlib>
#include <omp.h>
#include <cstdio>
#include <thread>
#include <random>

#define THREADS 8
#define N 32

int main ( ) {
    int i;

    std::random_device rd;
    std::mt19937 gen( rd() );
    std::uniform_int_distribution<> dis(5, 50);
    int i_long = 7;
#pragma omp parallel for num_threads(THREADS) schedule(dynamic) shared(gen,i_long)
    for (i = 0; i < N; ++i) {
        printf("Thread %d is doing iteration %d.\n", omp_get_thread_num( ), i);
        if ( i == i_long ) {
            std::this_thread::sleep_for( std::chrono::milliseconds( 400 ) );
        } else {
            std::this_thread::sleep_for( std::chrono::milliseconds( 10 ) );
        }
//        std::this_thread::sleep_for( std::chrono::milliseconds( 10*dis(gen) ) );
    }
    return 0;
}
//Output sorted by thread:
//Thread 0 is doing iteration 0
//Thread 0 is doing iteration 10
//Thread 0 is doing iteration 16
//Thread 0 is doing iteration 25
//Thread 1 is doing iteration 7   <<---- long sleep
//Thread 2 is doing iteration 1
//Thread 2 is doing iteration 11
//Thread 2 is doing iteration 21
//Thread 2 is doing iteration 28
//Thread 3 is doing iteration 15
//Thread 3 is doing iteration 22
//Thread 3 is doing iteration 30
//Thread 3 is doing iteration 5
//Thread 3 is doing iteration 8
//Thread 4 is doing iteration 14
//Thread 4 is doing iteration 19
//Thread 4 is doing iteration 26
//Thread 4 is doing iteration 29
//Thread 4 is doing iteration 6
//Thread 5 is doing iteration 13
//Thread 5 is doing iteration 18
//Thread 5 is doing iteration 24
//Thread 5 is doing iteration 4
//Thread 6 is doing iteration 12
//Thread 6 is doing iteration 2
//Thread 6 is doing iteration 20
//Thread 6 is doing iteration 27
//Thread 7 is doing iteration 17
//Thread 7 is doing iteration 23
//Thread 7 is doing iteration 3
//Thread 7 is doing iteration 31
//Thread 7 is doing iteration 9