Что мне делать с общей переменной в другом месте? - PullRequest
0 голосов
/ 18 октября 2011
void dequeue ()
{
     QITEM *qKill = qHead;
     .
     .
     .
      #pragma omp critical     
      qHead = qHead->qNext;
      free(qKill);       
}

void enqueue (int iNode, int iDist, int iPrev)
{
     .
     .
     .
     QITEM *qLast = qHead;

     #pragma omp critical
     {
          while (qLast->qNext) qLast = qLast->qNext;
          qLast->qNext = qNew;
     }
}

Я знаю, что если только один поток может получить доступ к критической секции в очереди и очереди.

Однако, если один поток обращается к критической секции в очереди, а другой поток обращается к критической секциив этом случае этот код должным образом защищает общий список?

qHead - указатель на заголовок связанного списка.

1 Ответ

1 голос
/ 18 октября 2011

В вашем коде вы используете неназванный критический раздел в OpenMP, который является глобальным и уникальным критическим разделом. Таким образом, только один поток может войти в раздел критических разделов в вашем коде. Чтобы ответить на ваш вопрос, да, вам не нужно беспокоиться о взаимной исключительности, поскольку существует один замок.

Чтобы использовать несколько блокировок в OpenMP, используйте имя в critical pragma.

http://software.intel.com/en-us/articles/more-work-sharing-with-openmp/

Примером будет #pragma omp critical(maxvalue).

Тем не менее, очевидно, что наличие нескольких блокировок увеличит вероятность мертвых блокировок, скачек данных, передачи блокировок и любых ошибок параллелизма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...