! { dg-do run } ! Test tasks with detach clause. Each thread spawns off a chain of tasks, ! that can then be executed by any available thread. Each thread uses ! taskwait to wait for the child tasks to complete. program task_detach_7 use omp_lib integer (kind=omp_event_handle_kind) :: detach_event1, detach_event2 integer :: x = 0, y = 0, z = 0 integer :: thread_count !$omp parallel private (detach_event1, detach_event2) !$omp single thread_count = omp_get_num_threads() !$omp end single !$omp task detach (detach_event1) untied !$omp atomic update x = x + 1 !$omp end task !$omp task detach (detach_event2) untied !$omp atomic update y = y + 1 call omp_fulfill_event (detach_event1) !$omp end task !$omp task untied !$omp atomic update z = z + 1 call omp_fulfill_event (detach_event2) !$omp end task !$omp taskwait !$omp end parallel if (x /= thread_count) stop 1 if (y /= thread_count) stop 2 if (z /= thread_count) stop 3 end program