Вы не можете сделать это с #pragma omp critical
, но вы можете использовать блокировки OpenMP:
quick-sort(args)
{
declare an instance of OpenMP lock
omp_init_lock( the lock instance )
spawn threads #x
{
// critical-region
omp_set_lock( the lock instance )
{
// code
}
omp_unset_lock( the lock instance )
}
omp_destroy_lock( the lock instance )
quick-sort(args)
quick-sort(args)
}
Поскольку каждый вызов quick-sort
будет объявлять свой собственный объект блокировки, он даст вам то, что вы хотите.
Однако из вашего псевдокода кажется, что у вас никогда не будет двух разных потоковых команд, работающих одновременно, если в других функциях нет параллельных областей OpenMP.Если единственный код с параллельной областью («порождает потоки») находится в quick-sort
, вам потребуется рекурсивный вызов этой функции изнутри параллельной области, чего у вас нет.