在OpenMP和Pthread中使用锁

| 我有一个同时使用Pthreads和OpenMP的程序。基本上,使用Pthread创建2个线程(线程A和B)来工作,在线程A中,OpenMP用于并行化for循环。 如果我有一个可由OpenMP线程以及线程B访问的全局变量,是否可以使用OpenMP中的锁来确保没有竞争条件? 我的想法:
int count = 0;

pthread_create(&ThreadA, &attr, WorkA, NULL);
pthread_create(&ThreadB, &attr, WorkB, NULL);

void *WorkA (void *t)
{
   #pragma omp parallel for
   for (i = 0 ; i < N ; i++)
   {
      // Do some work
      #pragma omp critical
      {
         // Do some other work
         OMP_SET_LOCK(&lock);
         count++;
         OMP_UNSET_LOCK(&lock);
      }
   }
}

void *WorkB (void *t)
{
   if (count > 0)
   {
      OMP_SET_LOCK(&lock);
      count--;
      OMP_UNSET_LOCK(&lock);
      // Do some work
   }
}
谢谢。     
已邀请:
根据OpenMP的实现,基础代码可以很好地使用pthread。就是说,OpenMP规范没有说明不同的线程模型是否会“很好地配合”。根据您所使用的实现是否已完成允许的工作,这可能会奏效,也可能不会奏效。不幸的是,我只能说要检查所用产品的文档,并查看其内容。我相信大多数实现都试图使它起作用。     
使用原子操作更改计数。首先,不需要使用互斥量来保护简单的++或-。互斥锁用于保护无法通过其他任何方式原子完成的任何操作。其次,在我看来,性能= 1 /((locks)^ 5)。即锁定迅速成为线程化应用程序性能问题的根源,因此请避免使用它们。第三...原子操作将与OpenMP完美配合。使用__sync_add_and_fetch或类似的原子操作来更改计数。它是在芯片上的硬件中实现的,因此它仅比++或-慢约2倍,而使用互斥锁时要慢约40倍。     

要回复问题请先登录注册