2016-09-13 2 views
1

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

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

Лучше ли распространять копию самого контейнера вместо указателя на него среди потоков?

+1

В потоках OpenMP есть собственный экземпляр переменных _private_, а не _shared_. Любое использование общей переменной может привести к гонке, если вы не используете ее правильно. – ilotXXI

ответ

1

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

Затем, считая, что ваши потоки читают и изменяют определенную переменную, если вы разделите эту переменную, у вас все еще будет условие гонки, так как все потоки имеют один и тот же экземпляр. Я предполагаю, что в вашем первом абзаце вы хотели сказать, что частные, как отметил @ilotXXI.

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

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

Смежные вопросы