1! { dg-do run } 2 3! Test tasks with detach clause. Each thread spawns off a chain of tasks, 4! that can then be executed by any available thread. Each thread uses 5! taskwait to wait for the child tasks to complete. 6 7program task_detach_7 8 use omp_lib 9 10 integer (kind=omp_event_handle_kind) :: detach_event1, detach_event2 11 integer :: x = 0, y = 0, z = 0 12 integer :: thread_count 13 14 !$omp parallel private (detach_event1, detach_event2) 15 !$omp single 16 thread_count = omp_get_num_threads() 17 !$omp end single 18 19 !$omp task detach (detach_event1) untied 20 !$omp atomic update 21 x = x + 1 22 !$omp end task 23 24 !$omp task detach (detach_event2) untied 25 !$omp atomic update 26 y = y + 1 27 call omp_fulfill_event (detach_event1) 28 !$omp end task 29 30 !$omp task untied 31 !$omp atomic update 32 z = z + 1 33 call omp_fulfill_event (detach_event2) 34 !$omp end task 35 36 !$omp taskwait 37 !$omp end parallel 38 39 if (x /= thread_count) stop 1 40 if (y /= thread_count) stop 2 41 if (z /= thread_count) stop 3 42end program 43