#include #include // Completely pointless function, just for doing something. int do_something() { #ifdef _OPENMP omp_lock_t lock; omp_init_lock(&lock); const unsigned NC = omp_get_max_threads(); fprintf(stderr, "Running %d iterations.\n", 10*NC); #pragma omp parallel shared(lock) { #pragma omp for for (int k = 0; k < 10*NC; ++k) { omp_set_lock(&lock); // ...CRITICAL STARTS fprintf(stderr, "Iteration: %d\n", k); omp_unset_lock(&lock); // ...CRITICAL ENDS } } #endif // _OPENMP return 0; } int main() { #ifdef _OPENMP fprintf(stderr, "Using OpenMP!\n"); fprintf(stderr, "\t---> Maximum number of threads available: %d\n", omp_get_max_threads()); fprintf(stderr, "\t---> Number of processing units: %d\n", omp_get_num_procs()); omp_set_dynamic(1); fprintf(stderr, "\t---> Using %s thread allocation strategy.\n", (omp_get_dynamic() ? "dynamic" : "static")); #else fprintf(stderr, "No OpenMP.\n"); #endif fflush(NULL); do_something(); return 0; }