我希望一段代码对当前线程团队来说是关键的,而不是全局关键的。我怎样才能做到这一点??
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
中,则需要从并行区域内部对该函数进行递归调用,但您没有这样做。