当前团队线程的关键区域



我希望一段代码对当前线程团队来说是关键的,而不是全局关键的。我怎样才能做到这一点??

quick-sort(args)
{
    spawn threads #x
    {
       critical-region
       {
            // code
       }
    }
    quick-sort(args)
    quick-sort(args)
}

在这里,open mp关键区域构造将在访问关键区域之前阻塞所有线程。但我对两个线程进入关键区域没有问题,只要它们不是同时产生的。我想要一个openMP的解决方案。

使用#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中,则需要从并行区域内部对该函数进行递归调用,但您没有这样做。

相关内容

最新更新