Является ли общий список между несколькими потоками условием гонки? - PullRequest
0 голосов
/ 28 мая 2010

У меня есть какой-то многопоточный код, который обычно отлично работает, но время от времени он ломается. Я пытаюсь точно определить проблему, но использование OpenMP делает это более трудным (проблема не возникает в последовательном). Я знаю, что множественный доступ к переменной (условия гонки) часто приводит к сбою программы.

У меня есть список, разделенный между несколькими потоками, и мне любопытно, является ли push_back () в этом списке кандидатом на состояние гонки, поэтому иногда происходит сбой моей программы? Если да, есть ли рекомендации, как с этим справиться?
- Скорость имеет первостепенное значение
- Я знаю, что использование #pragma omp critical решит условие гонки, но потенциально замедлит работу приложения (есть два списка, поэтому мне нужен критический, а не атомарный).

Единственная причина, по которой я не уверен в этом, заключается в том, что я выполнил пару тестов, используя контейнеры stl, но так и не получил тестовый код для сбоя.

Любые предложения будут с благодарностью!
Заранее спасибо,

Ответы [ 2 ]

1 голос
/ 28 мая 2010

Отказ от ответственности: я ничего не знаю об OpenMP конкретно. Однако я могу сказать, что да, два потока, выполняющие push_back (или любую другую операцию изменения) в списке одновременно, вызовут проблемы, точно так же, как и для одной переменной.

Я не знаю, какие инструменты дает вам OpenMP для защиты от этого. Некоторые общие подходы к решению этой проблемы:

  1. Установить блокировку (например, мьютекс) вокруг операций с переменной.
  2. Дайте каждому потоку свою собственную копию списка, и пусть они останутся независимыми. В конце процесса, в качестве отдельного шага, вы можете объединить результаты из разных потоков. (Это Map-Reduce, в значительной степени).

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

Если у вас мало потоков, в зависимости от размера тела вашего цикла, наиболее эффективным решением может быть простая блокировка.

0 голосов
/ 28 мая 2010

Контейнеры STL не являются поточно-ориентированными. Вам необходимо защитить доступ к ним, используя механизм синхронизации. Типичные могут быть семафором или мьютексом, причем мьютекс, как правило, быстрее двух.

...